標籤:部落格 elasticsearch 翻譯
全文檢索搜尋我們通過前文的簡單例子,已經瞭解了結構化資料的條件搜尋;現在,讓我們來瞭解全文檢索搜尋-- 怎樣通過匹配所有域的文本找到最相關的文章。關於全文檢索搜尋有兩個最重要的方面:
-
相似度計算
-
通過TF/IDF (see [relevance-intro]),地理位置接近演算法,模糊相似度演算法或者其他演算法,用來給給定查詢條件的結果排序。
-
文本分析
-
通過把文本切割和歸一化後的詞元,去(a)產生倒排索引,或者去(b)查詢倒排索引。
當我們在討論相似度計算和文本分析的時候,我們只是在討論查詢,而不是過濾詞條搜尋 vs. 全文檢索搜尋即使所有的查詢都要執行一些相似度排序,但是不是所有的查詢條件都需要文本分析。 因為有些特殊的查詢就不是在文本上執行的,列如
bool和
function_score。 它們是boolean查詢和數值查詢。文字查詢可以分為兩個種類:
-
詞條查詢
-
低層級的
term和
fuzzy查詢沒有文本分析,它們只是在單個詞條上查詢。列如詞條
"Foo"的
term查詢, 是在倒排索引種尋找完全符合的詞條,然後給每一篇包含這個詞條的文章做TF/IDF相似度打分。記住:詞條
"Foo"的
term查詢只是在倒排索引裡尋找完全符合的詞條,它不會匹配到
"foo"或者
"FOO"。 當你在
not_analyzed的域用
["Foo","Bar"]產生索引,或者在用
whitespace分析器的域用
"Foo Bar"產生索引, 它們都會在倒排索引裡產生兩個詞元
"Foo"和
"Bar"。
-
全文檢索查詢
-
進階別的
match和
query_string查詢能夠理解這些域的映射: * 如果在
date和
integer屬性的域,查詢文本會被當日期或者整數來對待。 * 如果在(
not_analyzed)屬性的文本域,查詢文本會被當做一個詞條來查詢。 * 但是,如果在(
analyzed)屬性的文本域,查詢文本會用恰當得分析器去產生詞條,而這些詞條都會被用來查詢。 一旦查詢得到這些詞條,它就用適當的低級查詢去執行每一個詞條,然後用查詢結果計算每一篇文章的相似度打分。 我們將在後面的章節中詳細介紹這個過程。
通常,你幾乎都不會直接用到基於詞元的查詢,更多的,你會用更方便的進階全文檢索查詢(其實內部是用基於詞元的查詢)當你想在
not_analyzed域查詢完全符合值的時候,你應該考慮一下你到底是用查詢還是過濾。 因為單詞條查詢通常被表示為二元值
yes|
no,所以過濾能更好的表達它們。你能從這裡收益的 filter caching:
GET /_search{ "query": { "filtered": { "filter": { "term": { "gender": "female" } } } }}
部落格已搬家
原文連結:http://www.callmer.com/?p=43