【问题标题】:Searching in multiple elasticsearch indexes using NEST使用 NEST 在多个弹性搜索索引中搜索
【发布时间】:2021-05-18 15:28:53
【问题描述】:

我正在尝试使用 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) {
      
    }
}

我正在使用弹性搜索 7.10.2

【问题讨论】:

    标签: c# elasticsearch nest elasticsearch-net


    【解决方案1】:

    the search response 中返回的每个原始点击都有与之关联的 _index meta field

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

    现在,在 NEST 中,

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

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

    所以诀窍是像这样use a loop

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

    【讨论】:

    • 感谢您的回复。但是,我如何访问每个属性的值。例如,我想从具有特定文本的 2 个索引中检索所有文档。如何检索它们并在控制台上打印它们。
    • 我可以通过 10 次点击获得响应。我的问题是如何访问其中的值并打印它们?
    • 在底部更新了我的答案。希望对您有所帮助。
    • 我的控制台现在看起来像这样。 Nest.Hit1[System.Object] Nest.Hit1[System.Object] Nest.Hit1[System.Object] Nest.Hit1[System.Object] Nest.Hit1[System.Object] Nest.Hit1[System.Object] Nest.Hit1[System.Object] Nest.Hit1[System.Object] 嵌套。点击`1[System.Object]
    • 我对 NEST 不太熟悉,无法进一步帮助您...如果这个问题,将对象打印到控制台超出了范围,但 this answer 可能会有所帮助。
    【解决方案2】:

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

    克服此问题的简单方法是hook up the JsonNetSerializer,然后将JObject 用于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 上的属性,但仍需要处理每个属性的类型。

    【讨论】:

    • @KomalKartan 如果有帮助,请点赞。如果它解决了问题,请标记为已接受:)
    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多