首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用elasticsearch在数组对象类型中进行精确搜索

使用elasticsearch在数组对象类型中进行精确搜索
EN

Stack Overflow用户
提问于 2012-10-01 23:24:25
回答 2查看 15.9K关注 0票数 17

我正在寻找一种在弹性搜索中进行精确数组匹配的方法。假设这些是我的文档:

代码语言:javascript
复制
{"id": 1, "categories" : ["c", "d"]}
{"id": 2, "categories" : ["b", "c", "d"]}
{"id": 3, "categories" : ["c", "d", "e"]}
{"id": 4, "categories" : ["d"]}
{"id": 5, "categories" : ["c", "d"]}

有没有一种方法可以搜索所有的文档,它们的类别是"c“和"d”(文档1和5),而不是更多或更少()?

额外的好处:搜索“这些类别中的一个”也应该是可能的(例如,你可以搜索"c“,得到1,2,3和5)

有什么聪明的方法来解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-02 00:38:18

如果您有一组离散的已知类别,则可以使用布尔查询:

代码语言:javascript
复制
"bool" : {
    "must" : {
        "terms" : { "categories" : ["c", "d"],
             minimum_should_match : 2
         }
    },
    "must_not" : {
        "terms" : { "categories" : ["a", "b", "e"],
             minimum_should_match : 1
         }
    }
}

否则,我认为实现这一点的最简单方法是存储另一个字段作为类别关键字。

代码语言:javascript
复制
{"id": 1, "categories" : ["c", "d"], "categorieskey" : "cd"}

差不多吧。然后,您可以很容易地使用术语查询来精确地查询您想要的结果,例如:

代码语言:javascript
复制
term { "categorieskey" : "cd" }

你仍然可以进行非排他性的搜索,比如;

代码语言:javascript
复制
term { "categories" : "c" }

查询两个必须同时存在的类别很容易,但随后阻止任何其他潜在类别出现就有点难了。也许你能做到。您可能希望编写一个查询来查找具有这两个记录的记录,然后对其应用筛选器,以消除除指定类别之外的所有记录。据我所知,Lucene实际上并不是为处理这种搜索而设计的。

老实说,我在这里想出一个好的过滤器有点麻烦。您可能需要脚本筛选器,或者可以在检索到结果后对其进行筛选。

票数 19
EN

Stack Overflow用户

发布于 2013-03-21 22:44:34

我为我们的用例找到了一个似乎可行的解决方案。它依赖于两个过滤器和我们想要匹配的类别的知识。我们使用术语筛选器和脚本筛选器来检查数组的大小。在本例中,marketBasketList类似于您的categories条目。

代码语言:javascript
复制
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "siteId": 4
          }
        },
        {
          "match": {
            "marketBasketList": {
              "query": [
                10,
                11
              ],
              "operator": "and"
            }
          }
        }
      ]
    },
    "boost": 1,
    "filter": {
      "and": {
        "filters": [
          {
            "script": {
              "script": "doc['marketBasketList'].values.length == 2"
            }
          },
          {
            "terms": {
              "marketBasketList": [
                10,
                11
              ],
              "execution": "and"
            }
          }
        ]
      }
    }
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12676234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档