繁体   English   中英

使用 NEST 在多个 elasticsearch 索引中搜索

[英]Searching in multiple elasticsearch indexes using NEST

我正在尝试使用嵌套 7.10.1 在 elasticsearch 中搜索文本。 我想在两个不同的索引中搜索,我以文档的形式得到响应,但我无法访问它的属性,因为结果具有两个索引的组合。 下面是我试过的代码。 两个索引具有相同的属性。 我在 foreach 循环中使用什么来访问结果文档的键和值。

public void searchIndices(string query) {
    var response = client.Search<object>(
      s => s.Index("knowledgearticles_index, index2")
            .Query(q => q.Match(m => m.Field("locationName")
                         .Query(query))));

    Console.WriteLine(response.Documents);
    
    foreach(object r in response.Documents) {
      
    }
}

我正在使用 elasticsearch 7.10.2

搜索响应中返回的每个原始命中都有与之关联的_index元字段

"hits" : {
  "total" : {
    "value" : 91,
    "relation" : "eq"
  },
  "hits" : [
    {
      "_index" : "knowledgearticles_index",   <---
      "_type" : "_doc",
      "_id" : "r_oLl3cBZOT6A8Qby8Qd",
      "_score" : 1.0,
      "_source" : {
        ...
      }
    }

现在,在 NEST 中,

.Documents是检索每次点击的_source的便捷简写

-- 意味着您将无法访问元属性。

所以诀窍是改用这样的循环

foreach (var hit in response.HitsMetadata.Hits) {
  Console.WriteLine(hit);
}

如果您搜索的两个索引包含不同的 JSON 结构,则Search<T> T的 T 需要是可以反序列化不同 JSON 结构的类型。 object将按照您问题中的示例工作,但是对于任何属性都没有类型访问权限。

克服这个问题的一个简单方法是连接JsonNetSerializer ,然后使用JObject for T

var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var connectionSettings =
    new ConnectionSettings(pool, sourceSerializer: JsonNetSerializer.Default);
var client = new ElasticClient(connectionSettings);

var response = client.Search<JObject>(s => s
    .Index("knowledgearticles_index, index2")
    .Query(q => q
        .Match(m => m
            .Field("locationName")
            .Query(query)
        )
     )
);

我们现在有一种访问JObject属性的方法,但仍需要处理每个属性的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM