前言
關于倒排索引等內容,將不做介紹到推,可以看<a href="">《Elasticsearch權威指南》</a>更多內容:<a href="">ELK修煉之道</a>
短語 vs 全文
雖然所有的查詢都會進行相關度計算,但不是所有的查詢都會有分析階段惕澎。而且像bool
或function_score
這樣的查詢并不在文本字段執(zhí)行分析莉测。
1、基于短語(Term-based)的查詢:
像term
(在filter上下文中)或fuzzy
一類的查詢是低級查詢唧喉,它們沒有分析階段捣卤。這些查詢在單一的短語上執(zhí)行。例如對單詞Foo
的term
查詢會在倒排索引里精確查找Foo
這個詞八孝,并對每個包含這個單詞的文檔計算TF/IDF相關度_score
term
查詢只在倒排查詢里精確低查找特定短語董朝,而不會匹配短語的其它變形,如Foo
或FOO
干跛。不管短語怎樣被加入索引子姜,都只匹配倒排索引里的準確值。如果你在一個設置了not_analyzed
的字段為["Foo", "Bar"]
建索引楼入,或者在一個用whitespace
解析器解析的字段為Foo Bar
建索引哥捕,都會在倒排索引里加入兩個索引Foo
和Bar
牧抽。
2、全文(Full-text)檢索
match
和query_string
這樣的查詢是高級查詢遥赚,他們會對字段進行分析:
- 如果檢索一個
date
或integer
字段扬舒,他們會把查詢語句作為日期或者整數(shù)格式數(shù)據(jù)。 - 如果檢索一個精確值(
not_analyzed
)字符串字段凫佛,他們會把整個查詢語句作為一個短語讲坎。 - 如果檢索一個全文(
analyzed
)字段,查詢會先用適當?shù)慕馕銎鹘馕霾樵冋Z句御蒲,產生需要查詢的短語列表。然后對列表中的每個短語執(zhí)行低級查詢诊赊,合并查詢結果厚满,得到最終的文檔相關度。
全文檢索
全文檢索最重要的兩個方面:
- 相關度(Relevance)
根據(jù)文檔與查詢相關程度對結果進行排序的能力碧磅。相關度可以使用TF/IDF碘箍,地理位置相近程度、模糊相似度或其他算法計算鲸郊。 - 分析(Analysis)
將一段文本轉換成一組唯一的丰榴、標準化了的標詞(term),用以(a)創(chuàng)建倒排索引,(b)查詢倒排索引
注意:
一旦我們提到相關度和分析秆撮,指的都是查詢(queries)而非過濾器(filters)
//驗證match查詢也不一定全部要做分析
PUT my_index3/
{
"mappings" : {
"my_type" : {
"properties" : {
"message" : {
"type" : "string",
"index" : "analyzed"
}
"message1" : {
"type" : "string",
"index" : "not_analyzed"
}
}
}
}
}
//索引一條數(shù)據(jù)
POST my_index3/my_type
{
"message" : "boy",
"message1" : "boy"
}
POST /my_index3/my_type/_search
{
"query": {
"filtered": {
"filter": {
"match": {
"message1": "BOY"
}
}
}
}
}
//response
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
//同樣的查詢message1就可以查到了
在很少的情況下四濒,你可能才需要使用基于詞條的查詢(Term-based Queries)。通常你需要查詢的是全文职辨,而不是獨立的詞條盗蟆,而這個
工作通過高級的全文查詢來完成會更加容易(在內部它們最終還是使用的基于詞條的低級查詢)。
match查詢
先來個例子入門說明match查詢的步驟:
{
"match" : {
"message" : "BOY"
}
}
Elasticsearch通過執(zhí)行下面的步驟執(zhí)行match查詢:
- 檢查field類型
? ? ? ?message
字段是一個字符串(analyzed
),所以該查詢字符串也需要被分析(analysis
) - 分析查詢字符串
? ? ? ?查詢詞boy
舒裤。因為我們只有一個查詢詞喳资,因此match查詢可以以一種低級別的term
查詢的方式執(zhí)行。 - 找到匹配的文檔
? ? ? ?term
查詢在倒排索引中搜索boy
,并且返回包含該詞的文檔腾供。 - 為每個文檔打分
? ? ? ?term
查詢綜合考慮詞頻(每篇文檔message
字段包含boy
的次數(shù))仆邓、逆文檔頻率(在全部文檔中message
字段boy
的次數(shù))、包含boy
的字段長度(長度越短越相關)來計算每篇文檔的相關性得分_score
伴鳖。
參考
<a >TF-IDF與余弦相似性的應用:阮一峰</a>