2015-07-20 43 views
0

我一直在編寫一個方法,它會在elasticsearch中使用各種搜索參數。我與這個樣子的查詢工作:在精確匹配的彈性搜索中鏈接fquery過濾器是否可能?

body: 
    {query: 
    {filtered: 
     {filter: 
     {and: 
      [ 
      {term: {some_term: "foo"}}, 
      {term: {is_visible: true}}, 
      {term: {"term_two": "something"}}] 
     } 
     } 
    } 
    } 

使用這個語法,我想我能在一起,這些術語鏈和編程產生這些查詢。我正在使用簡單的字符串,如果有一個像「person_name」這樣的術語,我可以將查詢分成兩部分,並說「哪裏的person_name匹配'JOHN'」,以及哪裏的person_name匹配'SMITH'「獲得準確的結果。

但是,我剛問過這個問題時遇到了「fquery」: Escaping slash in elasticsearch

我不能使用這個「和」/「term」過濾器在其中搜索一個帶斜線的值,所以我知道我可以使用fquery搜索的全部價值,像這樣

"fquery": { 
    "query": { 
     "match": { 
      "by_line": "John Smith" 

但我怎麼能像這樣搜索多個它EMS?似乎當我結合fquery和我的過濾/過濾/和/術語查詢時,我的「和」術語查詢被忽略。使用彈性搜索進行嵌套/鏈接查詢的最佳做法是什麼?

如在下面的評論,是我可以再補充fquery到「和」塊像這樣

{:filtered=> 
    {:filter=> 
    {:and=>[ 
     {:term=>{:is_visible=>true}}, 
     {:term=>{:is_private=>false}}, 
     {:fquery=> 
     {:query=>{:match=>{:sub_location=>"New JErsey"}}}}]}}} 

與「sub_location」 =「紐約」爲什麼還要elasticsearch返回結果?我只想在這裏返回「新球衣」。

+0

您應該能夠將查詢過濾器作爲過濾器包含在「和」過濾器中,就像您使用術語過濾器一樣。 – hudsonb

+0

你說得對。我已經用後續更新了我的問題 – jdkealy

回答

0

A match query分析輸入,默認情況下它是一個boolean OR查詢分析後是否有多個詞。在你的情況下,「新JErsey」被分析成「新」和「球衣」這兩個詞。您正在使用的match查詢將搜索索引字段「sub_location」的值爲「新」或「球衣」的文檔。這就是爲什麼您的查詢還會匹配由於常用術語「新」而使字段「sub_location」的值爲「紐約」的文檔。

要只對「新澤西」的比賽,你可以使用match查詢以下版本:

{ 
    "query": { 
     "match": { 
     "sub_location": { 
      "query": "New JErsey", 
      "operator": "and" 
     } 
     } 
    } 
} 

這將不匹配的文件,其中場「sub_location」的值是「紐約」。 但是,它將匹配字段「sub_location」的值爲「York New」的文檔,因爲查詢最終轉換爲像"York" AND "New"這樣的布爾查詢。如果你對這種行爲很好,那麼很好,其他人可以進一步閱讀。

出現所有這些問題是因爲您正在使用字段「sub_location」的默認分析器,該字段會在字邊界處破壞令牌併爲其編制索引。如果您真的不關心部分匹配並希望始終匹配整個字符串,則可以使用custom analyzers來使用Keyword TokenizerLowercase Token Filter。請注意,繼續使用這種方法將需要您重新爲所有文檔重新編制索引。