ElasticsearchCRUD使用(十四)【ElasticsearchCRUD搜索查询和过滤】

本文演示如何使用ElasticsearchCRUD进行搜索。 API提供了可以与Elasticsearch的搜索API一起使用的搜索模型。 您可以搜索同步/异步,并提供您自己的JSON字符串或使用搜索模型。

开始:

ElasticsearchCRUD提供了一些数字或搜索的可能性。 这篇文章展示了不同的例子,这些例子应该有助于理解或使它更容易使用搜索模型参数。 当配置和创建模型时,可以使用以下方法作为HTTP请求发送:

public ResultDetails<SearchResult<T>> Search<T>(
   Search search, 
    SearchUrlParameters searchUrlParameters = null
)

//or 

public async Task<ResultDetails<SearchResult<T>>> SearchAsync<T>(
   string searchJsonParameters, 
   SearchUrlParameters searchUrlParameters = null
)

搜索模型可以发送具有过滤器,查询或两者都有。 以下是一个简单的MatchAllFilter的例子:

var search = new Search 
{ 
    Filter = new Filter(
        new MatchAllFilter()
    )
};

搜索模型包含一个Filter属性和一个Query属性,它可以包含任何查询或任何过滤器类型。 可以根据需要选择所需的对象。
以下是一个简单的PrefixQuery示例:

var search = new Search
{
    Query = new Query(new PrefixQuery("name", "on"))
};

或者更复杂的搜索查询可能如下所示:

var search = new Search
{
    Query = new Query(
        new Filtered( 
            new Filter( 
                new MatchAllFilter { Boost = 1.1 } 
            )
        ) 
        { 
            Query = new Query(new MatchAllQuery())
        }       
    )
};

以上搜索将发送到Elasticsearch如下:

POST http://localhost:9200/<index>/<type>/_search HTTP/1.1
Content-Type: application/json
Host: localhost:9200
Content-Length: 86
Expect: 100-continue

{ 
  "query":{
   "filtered":{
      "query":{"match_all":{}},
      "filter":{"match_all":{"boost":1.1}}
    }
  }
}

您还可以使用Search类的ToString()方法来显示将发送到Elasticsearch的JSON查询。 调试查询或过滤器时,这非常有用。

GeoShapeQuery的一个例子:

var search = new Search
{
    Query = new Query(
            new GeoShapeQuery("circletest",
                new GeoShapePolygon
                {
                    Coordinates = new List<List<GeoPoint>>
                    {
                        new List<GeoPoint>
                        {
                            new GeoPoint(40,40),
                            new GeoPoint(50,40),
                            new GeoPoint(50,50),
                            new GeoPoint(40,50),
                            new GeoPoint(40,40)
                        }
                    }
                }
            )
    )
};

被翻译成:

{ 
  "query":{ 
     "geo_shape":{
       "circletest":{ 
          "shape":{ 
            "type":"polygon",
            "coordinates":[[ [40.0,40.0], [50.0,40.0], [50.0,50.0], [40.0,50.0], [40.0,40.0] ]] }
        }
     }
  }
}

具有线性衰减功能的FunctionScoreQuery可以这样配置:

var search = new Search
{
    Query = new Query(
        new FunctionScoreQuery(
            new MatchAllQuery(),
            new List<BaseScoreFunction>
            {
                new LinearGeoPointFunction(
                  "location", 
                  new GeoPoint(40,40), 
                  new DistanceUnitKilometer(100) 
                )
                {
                    Decay=0.3,
                    Filter = new MatchAllFilter(),
                    Offset= 3,
                    Weight= 3.0
                }
            }
        )
    )
};

排序

搜索模型还支持排序,正常排序,GeoPoint排序或脚本排序。

以下是Geo排序示例:

var search = new Search
{
    Query = new Query(new MatchAllQuery()),
    Sort = new SortHolder(
        new List<ISort>
        {
            new SortGeoDistance("location", DistanceUnitEnum.km)
            {
                GeoPoints = new List<GeoPoint>
                {
                    new GeoPoint(46, 46),
                    new GeoPoint(49, 46),
                },
                Order=OrderEnum.asc, Mode = SortModeGeo.max             
            }
        }
    )
};

或另一个脚本排序示例:

var search = new Search
{
    Query = new Query(new MatchAllQuery()),
    Sort = new SortScript("doc['lift'].value * factor")
    {
        Order = OrderEnum.asc,
        ScriptType= "number",
        Params = new List<ScriptParameter>
        {
            new ScriptParameter("factor", 1.5)
        }
    }
};

在撰写本文时,应支持不同查询和过滤器的所有可能配置。 一些Elasticsearch文档不是实际的,一些记录的特征不起作用。 所有的搜索模型类都有使用真正的Elasticsearch 搜索引擎(elasticsearch-1.4.2)的集成测试。 这将有助于保持代码接近实际情况。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值