全文搜索-介紹-elasticsearch-definitive-guide翻譯

我們通過前文的簡單例子,已經瞭解了結構化數據的條件搜索;現在,讓我們來了解全文搜索-- 怎樣通過匹配所有域的文本找到最相關的文章。
關於全文搜索有兩個最重要的方面:
相似度計算
通過TF/IDF (see [relevance-intro]),地理位置接近算法,模糊相似度算法或者其他算法,用來給給定查詢條件的結果排序。
文本分析
通過把文本切割和歸一化後的詞元,去(a)生成倒排索引,或者去(b)查詢倒排索引。
當我們在討論相似度計算和文本分析的時候,我們只是在討論查詢,而不是過濾

詞條搜索 vs. 全文搜索

即使所有的查詢都要執行一些相似度排序,但是不是所有的查詢條件都需要文本分析。 因爲有些特殊的查詢就不是在文本上執行的,列如boolfunction_score。 它們是boolean查詢和數值查詢。文本查詢可以分爲兩個種類:
詞條查詢
低級別的termfuzzy查詢沒有文本分析,它們只是在單個詞條上查詢。列如詞條"Foo"term查詢, 是在倒排索引種查找完全匹配的詞條,然後給每一篇包含這個詞條的文章做TF/IDF相似度打分。
記住:詞條"Foo"term查詢只是在倒排索引裏查找完全匹配的詞條,它不會匹配到"foo"或者"FOO"。 當你在not_analyzed的域用["Foo","Bar"]生成索引,或者在用whitespace分析器的域用"Foo Bar"生成索引, 它們都會在倒排索引裏生成兩個詞元"Foo""Bar"
全文查詢
高級別的matchquery_string查詢能夠理解這些域的映射: * 如果在dateinteger屬性的域,查詢文本會被當日期或者整數來對待。 * 如果在(not_analyzed)屬性的文本域,查詢文本會被當做一個詞條來查詢。 * 但是,如果在(analyzed)屬性的文本域,查詢文本會用恰當得分析器去產生詞條,而這些詞條都會被用來查詢。 一旦查詢得到這些詞條,它就用適當的低級查詢去執行每一個詞條,然後用查詢結果計算每一篇文章的相似度打分。 我們將在後面的章節中詳細介紹這個過程。
通常,你幾乎都不會直接用到基於詞元的查詢,更多的,你會用更方便的高級全文查詢(其實內部是用基於詞元的查詢)
當你想在not_analyzed域查詢完全匹配值的時候,你應該考慮一下你到底是用查詢還是過濾。 因爲單詞條查詢通常被表示爲二元值yes|no,所以過濾能更好的表達它們。你能從這裏收益的 filter caching:
GET /_search
{
    "query": {
        "filtered": {
            "filter": {
                "term": { "gender": "female" }
            }
        }
    }
}

博客已搬家

原文鏈接:http://www.callmer.com/?p=43

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章