2013-01-31 123 views
0

我正在使用ElasticSearch。 當我做這個查詢:與全文匹配的ElasticSearch「匹配」

{query: "blackberry -q10"} 

我得到正是我想(有參考黑莓但不是所有的Q10結果)。

但是,我想限制搜索字段只是「標題」字段。例如,_source文件有標題,正文,標籤等,我只想搜索標題。該ElasticSearch「匹配」,似乎適合我...

{query: {match: {title: "blackberry -q10"}}} 

雖然這成功地僅搜索標題,它仍然會返回與具有Q10的稱號,不像上面的搜索結果。

我在看the match documentation,但似乎無法弄清楚。

謝謝!

回答

1

匹配查詢不使用否定語法。例如,你不能使用「減號」來否定一個術語。它將被默認搜索分析器解析爲連字符。

我會在這種情況下使用過濾的查詢。您可以在查詢中添加否定...但過濾器會更快。

{ 
    "filtered":{ 
    "query":{ 
     "match":{ 
      "title":"blackberry" 
     } 
    }, 
    "filter":{ 
     "bool":{ 
      "must_not":{ 
       "term":{ 
        "title":"q10" 
       } 
      } 
     } 
    } 
    } 
} 

注意,你可能需要改變term過濾器,這取決於你如何分析領域在索引時間。

編輯: 根據您在下面的評論,如果你真的想保持做否定「內聯」的功能,你可以使用field查詢(的query_string一個更具體的版本,這也將工作)。此查詢使用Lucene的語法,這使得內嵌否定

{ 
    "field" : { 
     "title" : "blackberry -q10" 
    } 
} 

原因query_string,它是不推薦使用衍生品,是因爲它很容易搬起石頭砸自己的腳。或者說,你的用戶很容易在臉上拍攝你的服務器。 Query_string要求正確的語法,如果用戶輸入不正確,就會死亡。它還可以讓你的用戶做出一些可怕的低效率查詢,通常通過通配符

+0

我仍然非常在意邊緣案例。這個解決方案需要我自己解析輸入字符串,這非常不理想。例如,我沒有考慮過的引用或其他否定/添加方式呢?有沒有什麼辦法來保持我的第一個例子的內置解析,而僅限制搜索哪些字段? –

+0

用一個使用字段查詢的示例更新了我的評論,該查詢基本上是一個簡化的query_string查詢。 Query_string使用您最初使用的Lucene語法,並且當您不指定(這是您的原始查詢工作原因)時,它也是默認搜索查詢。 – Zach

+0

優秀!這正是我所期待的。 –

0

你想匹配所有擁有「黑莓」的標題,沒有q10,不是所有的標題都有「黑莓」或者沒有q10。

匹配的默認布爾運算符是(在大多數情況下)或。嘗試在您的查詢中添加「運算符」:「和」子句。

+0

添加「AND」操作符使得只有帶有BlackBerry AND Q10的標題才被返回。換句話說,它忽略了我的查詢字符串中的「 - 」。這讓我感到困惑,因爲正如我所說的那樣,將字符串傳遞到查詢中會正確地將字符串解析爲全文搜索(「BlackBerry-Q10」=>「有黑莓,沒有Q10」)。唯一的區別是我想限制搜索哪些字段。當然,我可以嘗試自己解析字符串,但是我擔心邊緣情況(引號?AND運算符等) –

+0

因此,請嘗試將其分解爲複合查詢(我將保留你把它轉換成lucene語法):「title:blackberry」AND -title:q10(換句話說,把標題關鍵字放在它們的兩次)。我在家裏穿着我的浴袍和一杯咖啡,所以這一秒鐘不能測試,但這就是我通常搜索這些東西的方式。 –

+0

你錯過了這一點。正如我上面所說,我自己寫這個解析器是一個非常糟糕的主意,我保證會錯過邊緣情況,並且我的函數應該接受來自用戶的自由形式輸入。 ElasticSearch顯然對這些FullText查詢有自己的內置解析器(參見我的第一個示例),那麼爲什麼我不能利用它? –