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

时间:2014-10-09 14:16:13

标签: 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

如何过滤掉其他单词?

1 个答案:

答案 0 :(得分:1)

如果您知道其他字,可以选择向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"]
        }
      }
    }
  }
}