2014-10-09 108 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"] 
     } 
     } 
    } 
    } 
} 
相關問題