Elasticsearch 查找仅包含列表中任意顺序的单词的匹配项

标签 elasticsearch

我试图让elasticsearch找到包含特定单词但仅包含这些单词的所有关键字。

我的尝试是:

{ "fields": ["keyword_norm"],
  "size": 100,
  "query":
  {
      "bool" : {
          "must" : [ {"match": {"keyword_norm": "shoe" }}, 
                     {"match": {"keyword_norm": "nike" } }
                  ]
  }
}
}

对于这样的查询,它会正确返回:

 shoe nike
 nike shoe

而且

 buy nike shoe
 nike shoe buy

如何过滤掉其他单词?

最佳答案

如果您知道其他单词,一个选择是向您的 bool query 添加一个 must_not 子句。 :

{
  "fields": ["keyword_norm"],
  "size": 100,
  "query": {
    "bool": {
      "must": [
        {"match": {"keyword_norm": "shoe" }}, 
        {"match": {"keyword_norm": "nike" }}
      ],
      "must_not": [
        {"match": {"keyword_norm": "buy" }}
      ]
    }
  }
}

否则,您可以扩展原始查询并添加 script filter .

{
  "fields": ["keyword_norm"],
  "size": 100,
  "query": {
    "filtered": {
      "query": {
        "must": [
          {"match": {"keyword_norm": "shoe" }}, 
          {"match": {"keyword_norm": "nike" }}
        ]
      },
      "filter": {
        "script": "#psuedo code-> words = doc['keyword_norm'].value.split(' '); for (word : words) { if(!terms.contains(word)) return 0; } return 1;",
        "params": {
          "terms": ["shoe", "nike"]
        }
      }
    }
  }
}

关于Elasticsearch 查找仅包含列表中任意顺序的单词的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26280762/

相关文章:

java - 在 elasticsearch 中存储视频的推荐方式是什么?

elasticsearch - 将SQL查询转换为ElasticSearch

elasticsearch - Logstash Beats Input-多个多行编解码器

elasticsearch - 如何在elasticsearch7中获取索引的项目数?

elasticsearch - 如何更新文档集的routingId

elasticsearch - Elasticsearch嵌套数据搜索性能

java - 使用 Java API 在 Elasticsearch 中创建 MongoDB River

django - 如何检索触发Elasticsearch查询命中的字段

elasticsearch - ElasticSearch无法从字符串转换为ElasticClient.searchRequestparameters

elasticsearch - 使用相同的字段名称为Elasticsearch中的嵌套文档建立索引