使用NEST C#Client搜索ElasticSearch
我开始四处寻找搜索引擎,经过一些阅读后我决定选择ElasticSearch(这太棒了:)),我的项目是在C#中,所以我四处寻找客户并开始使用NEST ,一切都很简单,但我是在搜索部分有点困惑。
我想搜索特定类型的 所有字段 ,我想出的是以下代码:
elasticClient.Search(s => s.Query(q => q.QueryString(d => d.Query(queryString))));
我看到很多字符串查询搜索已被弃用,并希望确保上述方法是正确的(上面没有标记为已弃用…)对于一个简单的任务也有点长,所以也许有人知道这样做的另一种方式。
谢谢
我只使用字符串查询版本:使用C#匿名类型创建我的查询对象并将其序列化为JSON。
这样,我就可以直接从所有JSON查询示例中进行映射,无需转换为此“查询DSL”。
Elasticsearch本身发展得非常迅速,因此这种查询DSL必然缺乏一些function。
编辑:示例:
var query = "blabla"; var q = new { query = new { text = new { _all= query } }, from = (page-1)*pageSize, size=pageSize }; var qJson = JsonConvert.SerializeObject(q); var hits = _elasticClient.Search(qJson);
只是为了确认
elasticClient.Search
搜索的首选方式和感觉有点长的事实是因为您可以使用很多可以在这里使用的选项。 我总是乐于接受让它更短的建议!
不推荐使用字符串重载,但不会从NEST中删除。 我将更新过时的消息以明确提及此。
如果上面的匿名类型不是你的东西,你可以只使用json.net中的JObjects并以这种方式构建你的查询。 然后你可以用上面相同的方式运行它。
JObject query = new JObject(); query["query"] = new JObject(); query["query"]["text"] = new JObject(); query["query"]["text"]["_all"] = searchTerm; query["from"] = start; query["size"] = maxResults; string stringQuery = JsonConvert.SerializeObject(query); var results = connectedClient.SearchRaw(stringQuery);
我更喜欢这种方式,因为ES中的DSL使用C#中的保留关键字,比如bool,所以我不必进行任何转义。
使用ElasticSearch 2.0,我必须在Search方法中使用SearchResponse
var json = JsonConvert.SerializeObject(searchQuery); var body = new PostData
希望它有所帮助。
注意:我发现很少有关于PostData类及其generics类型参数的文档