前言
關(guān)于倒排索引等內(nèi)容,將不做介紹,可以看<a href="">《Elasticsearch權(quán)威指南》</a>更多內(nèi)容:<a href="">ELK修煉之道</a>
短語(yǔ) vs 全文
雖然所有的查詢都會(huì)進(jìn)行相關(guān)度計(jì)算,但不是所有的查詢都會(huì)有分析階段。而且像bool或function_score這樣的查詢并不在文本字段執(zhí)行分析。
1、基于短語(yǔ)(Term-based)的查詢:
像term(在filter上下文中)或fuzzy一類的查詢是低級(jí)查詢,它們沒(méi)有分析階段。這些查詢?cè)趩我坏亩陶Z(yǔ)上執(zhí)行。例如對(duì)單詞Foo的term查詢會(huì)在倒排索引里精確查找Foo這個(gè)詞,并對(duì)每個(gè)包含這個(gè)單詞的文檔計(jì)算TF/IDF相關(guān)度_score
term查詢只在倒排查詢里精確低查找特定短語(yǔ),而不會(huì)匹配短語(yǔ)的其它變形,如Foo或FOO。不管短語(yǔ)怎樣被加入索引,都只匹配倒排索引里的準(zhǔn)確值。如果你在一個(gè)設(shè)置了not_analyzed的字段為["Foo", "Bar"]建索引,或者在一個(gè)用whitespace解析器解析的字段為Foo Bar建索引,都會(huì)在倒排索引里加入兩個(gè)索引Foo和Bar。
2、全文(Full-text)檢索
match和query_string這樣的查詢是高級(jí)查詢,他們會(huì)對(duì)字段進(jìn)行分析:
- 如果檢索一個(gè)
date或integer字段,他們會(huì)把查詢語(yǔ)句作為日期或者整數(shù)格式數(shù)據(jù)。 - 如果檢索一個(gè)精確值(
not_analyzed)字符串字段,他們會(huì)把整個(gè)查詢語(yǔ)句作為一個(gè)短語(yǔ)。 - 如果檢索一個(gè)全文(
analyzed)字段,查詢會(huì)先用適當(dāng)?shù)慕馕銎鹘馕霾樵冋Z(yǔ)句,產(chǎn)生需要查詢的短語(yǔ)列表。然后對(duì)列表中的每個(gè)短語(yǔ)執(zhí)行低級(jí)查詢,合并查詢結(jié)果,得到最終的文檔相關(guān)度。
全文檢索
全文檢索最重要的兩個(gè)方面:
- 相關(guān)度(Relevance)
根據(jù)文檔與查詢相關(guān)程度對(duì)結(jié)果進(jìn)行排序的能力。相關(guān)度可以使用TF/IDF,地理位置相近程度、模糊相似度或其他算法計(jì)算。 - 分析(Analysis)
將一段文本轉(zhuǎn)換成一組唯一的、標(biāo)準(zhǔn)化了的標(biāo)詞(term),用以(a)創(chuàng)建倒排索引,(b)查詢倒排索引
注意:
一旦我們提到相關(guān)度和分析,指的都是查詢(queries)而非過(guò)濾器(filters)
//驗(yàn)證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)。通常你需要查詢的是全文,而不是獨(dú)立的詞條,而這個(gè)
工作通過(guò)高級(jí)的全文查詢來(lái)完成會(huì)更加容易(在內(nèi)部它們最終還是使用的基于詞條的低級(jí)查詢)。
match查詢
先來(lái)個(gè)例子入門(mén)說(shuō)明match查詢的步驟:
{
"match" : {
"message" : "BOY"
}
}
Elasticsearch通過(guò)執(zhí)行下面的步驟執(zhí)行match查詢:
- 檢查field類型
? ? ? ?message字段是一個(gè)字符串(analyzed),所以該查詢字符串也需要被分析(analysis) - 分析查詢字符串
? ? ? ?查詢?cè)~boy。因?yàn)槲覀冎挥幸粋€(gè)查詢?cè)~,因此match查詢可以以一種低級(jí)別的term查詢的方式執(zhí)行。 - 找到匹配的文檔
? ? ? ?term查詢?cè)诘古潘饕兴阉?code>boy,并且返回包含該詞的文檔。 - 為每個(gè)文檔打分
? ? ? ?term查詢綜合考慮詞頻(每篇文檔message字段包含boy的次數(shù))、逆文檔頻率(在全部文檔中message字段boy的次數(shù))、包含boy的字段長(zhǎng)度(長(zhǎng)度越短越相關(guān))來(lái)計(jì)算每篇文檔的相關(guān)性得分_score。
參考
<a >TF-IDF與余弦相似性的應(yīng)用:阮一峰</a>