2016-08-11 91 views
0

我的目的是结合2个多重匹配查询,如下所示。我希望MPN或SKU字段必须匹配每个关键字。因此,关键字“hp”和“301”都必须存在于MPN或SKU中。 或Name或Name.raw应该具有关键字“hp”或“301”中的一个。 完全匹配是MPN/SKU应该有更高的分数。 我写了如下查询,但它不返回任何结果,虽然有文件有这些条件。 我的问题是,如何结合多个匹配查询?

1) Does must query require keyword to be found in both SKU and MPN 
for the multi_match query? 

2) Combination of must and should is AND or OR? it looks like AND 
for me as it doesn't return any result. if it is AND, how to make it 
as OR? I cant find any operator on bool. I tried to wrap in another 
should query but it didnt help. 

我也很欣赏我的目的的任何查询建议。

"from": 0, 
     "size": 10, 
     "explain": true, 
     "query": { 
      "bool": { 
      "must": [ 
       { 
        "multi_match": { 
         "type": "best_fields", 
         "query": "hp 301", 
         "fields": [      
         "MPN^9", 
         "SKU^8"    
         ], 
       "operator": "and" 
        } 
       } 
      ], 
      "should": [ 
       {"multi_match": { 
         "type": "best_fields", 
        "query": "hp 301", 
        "fields": [ 
         "Name.raw2^7.5", 
         "Name^7" 
         ] 
       }} 
      ] 
      } 
     } 

回答

0

我假设这个问题与这个问题有关。 How do && and || work constructing queries in NEST?

如果我理解正确的话,一定的组合,并应与作为必应作为一个助推器,他只要说下面

bool 
>  must 
>   term1 
>  should 
>   term2 
>   term3 
>   term4 

这是因为一个布尔查询有一个必须条款应该开始充当推动因素。所以在

以前你能拿回来,只有包含字词1这是 显然不是你输入的严格意义上的布尔想要的结果。

因此,我将我的查询改为2查询,其中一个查询与“AND”运算符。所以这个行为就像MUST一样,因为它会强制所有的搜索关键字在字段中找到。

"from": 0, 
     "size": 10, 
     "explain": true, 
     "query": { 
      "bool": { 
      "should": [ 
       { 
        "multi_match": { 
         "type": "best_fields", 
         "query": "hp 301", 
         "fields": [      
         "MPN^9", 
         "SKU^8"    
         ], 
       "operator": "and" 
        } 
       }    , 
       { 
       "multi_match": { 
         "type": "best_fields", 
        "query": "hp 301", 
        "fields": [ 
         "Name.raw2^7.5", 
         "Name^7" 
         ] 
       } 
       } 
      ] 

      } 
     }