一尘不染

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

elasticsearch

我创建了这个功能:

            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以定位特定索引”

但是我该怎么办呢?


阅读 850

收藏
2020-06-22

共1个答案

一尘不染

由于不建议使用indexs查询,因此它目前仍可以使用,但不推荐使用该警告是可能在将来的主要版本中将其删除。

您可以通过以下方式实现与索引查询相同的功能:

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"
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}
2020-06-22