2015-06-03 43 views
-1
  1. 我想编写一个查询,将匹配多个名称,下面的查询该 是好的,但它不是做精确匹配例如,它也给 结果与名“XA”或'BY',我想要名称是精确的A或确切的B.可以有人告诉我我做错了什么。
  2. 而且是有可能匹配像名称= A或姓= A或多个字段名= B或姓= B与Elasticsearch布尔过滤器和运算符

    { 
        "filter": { 
           "bool": { 
            "should": [ 
            { 
             "term": { 
             "Name": "A" 
             } 
            },{ 
             "term": { 
             "Name": "B" 
             } 
            } 
            ] 
           } 
           },"sort": [ 
           { 
            "Pub": { 
            "Rank": "desc" 
            } 
           } 
           ] 
          } 
    

回答

0

在布尔查询,must装置的所有查询必须评估真(所以就像一个逻辑与),并且should意味着至少有一个必须评估为真(所以就像是一个逻辑OR)。

  1. 要在名称上有完全匹配,您需要使用Keyword analyzer。这将停止名称被标记为空格,所以“威廉RIker”将被索引为(“关键字分析器”)[“威廉Riker”]或(默认分析器)[“威廉”,“Riker”]。在默认情况下,它将匹配“William”或“Riker”的术语查询。在关键字的情况下,它只会匹配全名。

  2. 要做你想做的事,“名字= A或者姓氏= A或者名字= b或者姓氏= b”,那么你可以做4个应该子句。

 
    { 
     "bool":{ 
      "should":[ 
      { 
       "term":{ 
        "Name":"A" 
       } 
      }, 
      { 
       "term":{ 
        "Name":"B" 
       } 
      }, 
      { 
       "term":{ 
        "Surname":"A" 
       } 
      }, 
      { 
       "term":{ 
        "Surname":"B" 
       } 
      } 
      ] 
     } 
    } 
+0

我试着查询与''绝,但没有运气还是它仍然匹配“威廉”或“里克” – Ironman

+0

我的回答你的问题第1部分解释了为什么。 – monkjack

+0

如何更新名称映射并使其不能分析当前索引? – Ironman