使用NEST C#客户端搜索ElasticSearch

6

我开始寻找一个搜索引擎,经过一些阅读后,我决定选择ElasticSearch(非常惊人:)),我的项目是用C#编写的,所以我寻找了一个客户端,并开始使用NEST,一切都很简单,但在搜索部分我有点困惑。

我想要在特定类型的所有字段上进行搜索,我想到的代码如下:

elasticClient.Search<NewType>(s => s.Query(q => q.QueryString(d => d.Query(queryString))));

我看到很多字符串查询搜索已被弃用,想确保上述方法是正确的(上述方法没有标记为弃用...),此外,这个方法对于一个简单的任务来说有点长,也许有人知道另一种方法。谢谢。
4个回答

12

我只使用字符串查询版本:使用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);

有没有可能提供一个小的代码示例(一行,不要太长 :))?我没有完全理解你的意思... - keisar
1
没有重载可以接受一个字符串参数的 Search - Marcus

5

确认一下:

elasticClient.Search<NewType>(s => s.Query(q => q.QueryString(d => d.Query(queryString))));

这是首选的搜索方式,感觉有点长是因为有很多选项可以使用,但在这里没有用到。我总是乐于接受缩短代码长度的建议!

字符串重载已被弃用,但不会从NEST中删除。我将更新过时消息,明确说明这一点。


嗨,更新消息会非常有帮助,但如果您不打算删除它,为什么要弃用它?我认为它应该更方便,因为许多人使用NEST进行自由形式搜索(文本框输入),也许只需elasticClient.Search<NewType>(s => s.Query("query string"))(我相信这是已弃用的 :))无论如何,很棒的客户端,感谢您提供它! - keisar
elasticClient.Search<NewType>(s => s.Query("query string")) 作为 elasticClient.Search<NewType>(s => s.Query(q => q.QueryString(d => d.Query(queryString)))); 的快捷方式可能是一个非常好的主意,我可能会将其重命名为 elasticClient.Search<NewType>(s => s.QueryString("query string"))。谢谢 keisar :) - Martijn Laarman
我将其弃用是因为如果您正在使用原始的json重载,我非常想知道原因。这就是为什么我使用了deprecate()并附上了一个指向github的链接,但如果它引起问题或混淆,我可能会在1.0发布之前撤回这个决定。 - Martijn Laarman
已实现 :) https://github.com/Mpdreamz/NEST/commit/0d4df7440da471548a5401be5cada8b865fd30f1 - Martijn Laarman
太快了 :) 我会在接下来的几天内查看它,我可能会注册项目并做出贡献,再次感谢您的项目和回复。 - keisar

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,所以我不需要进行任何转义。

1
你使用的是哪个版本?我在 SearchRaw 中遇到了错误。 - abdul qayyum

1
使用ElasticSearch 2.0时,我需要在搜索方法中使用SearchResponse< NewType >,如下所示:
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类及其通用类型参数的文档很少。

PostData<T>的文档在这里找到 - https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/post-data.html。我会看看是否可以添加一些示例用法。 - Russ Cam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接