6

我开始四处寻找搜索引擎,经过阅读后我决定使用 ElasticSearch(这非常棒:)),我的项目在 C# 中,所以我四处寻找客户并开始使用NEST,一切都很简单,但我是在搜索部分有点困惑。

我想搜索特定类型的所有字段,我想出的是以下代码:

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

我看到很多字符串查询搜索已被弃用,并想确保上面是正确的方法(上面没有标记为不推荐使用......)而且对于一个简单的任务来说它有点长所以也许任何人知道另一种方法。

谢谢

4

4 回答 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);
于 2012-05-14T11:18:04.087 回答
5

只是为了确认

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

是首选的搜索方式,而且感觉有点长的事实是因为您可以使用很多在这里没有使用的选项。我总是对缩短它的建议持开放态度!

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

于 2012-07-04T20:51:30.720 回答
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,所以我不必进行任何转义。

于 2013-08-24T16:57:32.840 回答
1

使用 ElasticSearch 2.0,我必须在 Search 方法中使用 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 类及其泛型类型参数的文档很少

于 2016-03-14T14:30:01.610 回答