我正在尝试使用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
如何过滤掉其他单词?
答案 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"]
}
}
}
}
}