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

时间:2017-06-10 08:25:16

标签: elasticsearch lucene

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

示例文档:

{"id": 1, "categories" : ["A", "C","E"]}
{"id": 2, "categories" : ["A", "C"]}
{"id": 3, "categories" : ["C", "A"]}

当我用" A" AND" C",它只会返回第一个和第三个文件

{"id": 1, "categories" : ["A", "C","E"]}
{"id": 2, "categories" : ["A", "C"]}

第三个不应该被退回,因为订单不匹配。

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

{
    "sort": [
      {
        "modified": {
          "order": "desc"
        }
      }
    ],
    "query": {
      "bool": {
        "filter": {
          "bool": {
            "must": [
              {
                "term": {
                  "categories": "A"
                }
              },
              {
                "term": {
                  "categories": "C"
                }
              }
            ]
          }
        }
      }
    }
  }

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

还有其他方法吗?

1 个答案:

答案 0 :(得分:5)

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

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

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