如何使用ElasticSeach(C#/ NEST)搜索多个索引?

时间:2017-08-04 09:43:28

标签: c# elasticsearch nest

我创建了这个功能:

            public static ISearchResponse<Immo> searchImmoByCustomerField(Nest.ElasticClient esClient, string esIndex, string esIndex2, int from, int take, string qField, string nmqField, string qTerm, string nmqTerm)
            {
                var result = esClient.Search<Immo>(s => s
                        .AllIndices()
                            .Query(q => q
                                .Indices(i => i
                                    .Indices(new[] { esIndex, esIndex2 })
                                    .Query(iq => iq.Term(qField, qTerm))
                                    .NoMatchQuery(iq => iq.Term(nmqField, nmqTerm))
                                )
                            )
                 );
                return result;
            }

在2个索引中查找搜索词的函数。 Visual Studio向我显示消息:

  

“已弃用。您可以在查询中指定_index以定位特定索引”

但我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

indices query is deprecated因此它目前仍然有效,但弃用是一个警告,它可能会在未来的主要版本中删除。

您可以使用

实现与索引查询相同的功能
var esIndex = "index-1";
var esIndex2 = "index-2";
var qField ="query-field";
var qTerm = "query-term";
var nmqField = "no-match-query-field";
var nmqTerm = "no-match-query-term";

client.Search<Immo>(s => s
    .AllIndices()
    .Query(q => (q
        .Term(t => t
            .Field(qField)
            .Value(qTerm)

        ) && +q
        .Terms(t => t
            .Field("_index")
            .Terms(new[] { esIndex, esIndex2 })
        )) || (q
        .Term(t => t
            .Field(nmqField)
            .Value(nmqTerm)
        ) && !q
        .Terms(t => t
            .Field("_index")
            .Terms(new[] { esIndex, esIndex2 })
        ))
    )
);

生成以下查询JSON

POST http://localhost:9200/_all/immo/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "query-field": {
                    "value": "query-term"
                  }
                }
              }
            ],
            "filter": [
              {
                "terms": {
                  "_index": [
                    "index-1",
                    "index-2"
                  ]
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "no-match-query-field": {
                    "value": "no-match-query-term"
                  }
                }
              }
            ],
            "must_not": [
              {
                "terms": {
                  "_index": [
                    "index-1",
                    "index-2"
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}