2012-11-21 92 views
0

我試圖在搜索匹配「紐約」(不包含「新」或「紐約」單獨地)Elasticsearch - 全文檢索

這裏是我當前的查詢:

"query" : {       
    "query_string" : {    
     "query" : "new york" , 
     "fields" : ["city"] 
    } 
}, 
"filter" : { 
    "and" : [{ 
     "query" : {     
      "query_string" : {      
       "query" : "country:US"    
      }    
     } 
    }] 
}    

然而,這不斷返回名爲「約克」,而不是「紐約」的地方

我不完全理解這是如何工作的,並希望得到這個實際爲我工作的一些幫助。

+0

我不知道elasticsearch,但我的猜測是''紐約''中的空間充當布爾或操作符。試試'「\」紐約\「」'也許。 –

+0

感謝您的回覆,當我這樣做時,它似乎不起作用。 –

回答

3

如果你想兩個詞出現在同一個文檔中,你需要改變默認的操作是這樣的:

"query" : {       
    "query_string" : {    
     "query" : "new york" , 
     "fields" : ["city"], 
     "default_operator" : "AND" 
    } 
} 

或指定它離子查詢:

"query" : {       
    "query_string" : {    
     "query" : "new AND york" , 
     "fields" : ["city"] 
    } 
} 

看一看query string文檔。

否則,如果你想這兩個詞出現彼此接近的同一文檔中,你需要做一個phrase query是這樣的:由Elasticsearch這確實

"query" : { 
    "match_phrase" : { 
     "message" : "new york" 
    } 
} 
0

默認情況下,市場在「分析」單詞的默認標記。

New York => *New*, *York* 

爲了保持標記不變(主要用於聚合),你需要明確地讓城市場「不分析」使用多場

'city' => [ 
      'type' => 'string', 
      'fields' => [ 
      'raw' => [ 
       'type' => 'string', 
       'index' => 'not_analyzed' 
       ] 
      ] 
     ] 

現在你可以使用city.raw獲得未分析的值。