2014-10-09 110 views
1

我试图让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 

我怎么能过滤掉那些换句话说?

+0

你可以发布你的映射吗? – 2014-10-09 17:54:13

回答

1

一个选项,如果你知道换句话说是一个must_not条款添加到您的bool query

{ 
    "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"] 
     } 
     } 
    } 
    } 
} 
相关问题