我开始寻找搜索引擎,经过一些阅读后我决定选择ElasticSearch(这非常了不起:)),我的项目是在C#中,所以我四处寻找客户并开始使用NEST,一切都很简单,但我对搜索部分感到有点困惑。
我想在特定类型上搜索所有字段,我想出的是以下代码:
elasticClient.Search<NewType>(s => s.Query(q => q.QueryString(d => d.Query(queryString))));
我看到很多字符串查询搜索已被弃用,并且希望确保以上是正确的方法(上面没有标记为已弃用...)对于一个简单的任务它也有点长所以也许有人知道这样做的另一种方式。
由于
答案 0 :(得分:14)
我只使用字符串查询版本:使用C#匿名类型创建我的查询对象并将其序列化为JSON。
这样,我可以直接从所有JSON查询示例中进行映射,无需转换为此“查询DSL”。
Elasticsearch本身发展得非常迅速,因此这个查询DSL必然缺少一些功能。
编辑:示例:
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<SearchItem>(qJson);
答案 1 :(得分:5)
只是为了确认
elasticClient.Search<NewType>(s => s.Query(q => q.QueryString(d => d.Query(queryString))));
搜索的首选方式和感觉有点长的事实是因为您可以使用很多可以在这里使用的选项。我总是愿意建议缩短它!
不推荐使用字符串重载,但不会从NEST中删除。我将更新过时的消息以明确提及此。
答案 2 :(得分:2)
如果上面的匿名类型不是你的东西,你可以使用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<SearchItem>(stringQuery);
我更喜欢这种方式,因为ES中的DSL在C#中使用保留关键字,比如bool,所以我不必进行任何转义。
答案 3 :(得分:1)
使用ElasticSearch 2.0,我必须使用SearchResponse&lt; NewType&gt;在搜索方法中,如下所示:
var json = JsonConvert.SerializeObject(searchQuery);
var body = new PostData<object>(json);
var res = _elasticClient.Search<SearchResponse<NewType>>(body);
IEnumerable<NewType> result = res.Body.Hits.Select(h => h.Source).ToList();
希望有所帮助。
注意:我发现很少有关于PostData类及其泛型类型参数的文档