在Elasticsearch中按照确切的顺序搜索多个值

Red*_*ant 2 lucene elasticsearch

我正在寻找一种方法来进行精确的数组匹配,其中项目必须按顺序排列.

示例文件:

{"id": 1, "categories" : ["A", "C","E"]}
{"id": 2, "categories" : ["A", "C"]}
{"id": 3, "categories" : ["C", "A"]}
Run Code Online (Sandbox Code Playgroud)

当我用"A"和"C"搜索时,它只返回第一个和第三个文件

{"id": 1, "categories" : ["A", "C","E"]}
{"id": 2, "categories" : ["A", "C"]}
Run Code Online (Sandbox Code Playgroud)

不应该返回第三个,因为订单不匹配.

我已经尝试了以下查询,但它仍将返回第三个文档,因为它没有考虑顺序:

{
    "sort": [
      {
        "modified": {
          "order": "desc"
        }
      }
    ],
    "query": {
      "bool": {
        "filter": {
          "bool": {
            "must": [
              {
                "term": {
                  "categories": "A"
                }
              },
              {
                "term": {
                  "categories": "C"
                }
              }
            ]
          }
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

我有超过50个字段,我想提供这个确切的订单搜索选项,所以我不希望添加额外的字段服务作为类别关键字并查询"AC",{"id":1,"类别":["c ","d"],"categorieskey":"cd"}

这有什么其他方法吗?

And*_*fan 5

您需要添加该categorieskey字段,因为:

  • 这应该在搜索时提供最佳性能.只是匹配字段中的精确值(基本上是term过滤器,没有任何复杂的)
  • 我不认为这有一个简单的方法.即使您不使用categorieskeyElasticsearch也无法知道这些术语的顺序.并且在_source痛苦中执行搜索/过滤,使用许多资源并且搜索将不会很快

总而言之,继续添加该领域,这是我认为最好的方法.