近似匹配
使用TF/IDF的標(biāo)準(zhǔn)全文檢索是檢索字段中是否包含某些詞語(yǔ),而無(wú)法得知詞語(yǔ)之間的關(guān)系琉雳。
理解分詞之間的關(guān)系是一個(gè)復(fù)雜的難題划乖,我們無(wú)法通過(guò)換一種查詢方式去解決。但我們至少可以通過(guò)出現(xiàn)在彼此附近或者僅僅是彼此相鄰的分詞來(lái)判斷一些似乎相關(guān)的分詞昼捍。
短語(yǔ)匹配或者近似匹配木张。
短語(yǔ)匹配
保留那些包含全部搜索詞項(xiàng),且位置與搜索詞項(xiàng)相同的文檔
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": "quick brown fox"
}
}
}
也可以寫(xiě)成
"match": {
"title": {
"query": "quick brown fox",
"type": "phrase"
}
}
詞項(xiàng)的位置
當(dāng)一個(gè)字符串被分詞后端三,不但會(huì)返回一個(gè)詞項(xiàng)列表舷礼,還會(huì)返回各詞在原始字符串中的 位置或者順序關(guān)系
被認(rèn)定和短語(yǔ)quick brown fox
匹配的文檔,應(yīng)該滿足下列要求
1郊闯、三個(gè)詞項(xiàng)全部出現(xiàn)在域中
2妻献、brown位置比quick大1
3、fox位置比quick大2
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": {
"query": "quick fox",
"slop": 1
}
}
}
}
slop參數(shù)使得查詢?cè)~條相隔多遠(yuǎn)時(shí)仍然被視為匹配团赁,上文查詢quick brown fox育拨,會(huì)被匹配
多值字段
由于es的索引方式導(dǎo)致多值字段的索引位置如下
PUT /my_index/groups/1
{
"names": [ "John Abraham", "Lincoln Smith"]
}
會(huì)被索引成
Position 1: john
Position 2: abraham
Position 3: lincoln
Position 4: smith
于是查詢abraham lincoln
就會(huì)被匹配到
解決方式,設(shè)置position_increment_gap欢摄,相當(dāng)于增加距離熬丧,這樣子就不容易被匹配到了
PUT /my_index/_mapping/groups (2)
{
"properties": {
"names": {
"type": "string",
"position_increment_gap": 100
}
}
}
此時(shí)映射為
Position 1: john
Position 2: abraham
Position 103: lincoln
Position 104: smith
此時(shí)如果還想要被匹配,需要設(shè)置slop為100
越近越好
鄰近查詢怀挠,當(dāng)slop大于0的時(shí)候析蝴,會(huì)將鄰近度考慮到_score中
使用鄰近度提高相關(guān)度
GET /my_index/my_type/_search
{
"query": {
"bool": {
"must": {
"match": { (1)
"title": {
"query": "quick brown fox",
"minimum_should_match": "30%"
}
}
},
"should": {
"match_phrase": { (2)
"title": {
"query": "quick brown fox",
"slop": 50
}
}
}
}
}
}
性能優(yōu)化
短語(yǔ)查詢和鄰近查詢都比簡(jiǎn)單的query查詢代價(jià)更高。
有效的方法時(shí)減少需要通過(guò)短語(yǔ)查詢檢查的文檔總數(shù)绿淋。
我們只想對(duì)頂部文檔重新排序闷畸,比如phrase查詢只是為了從每個(gè)分片中獲取前k個(gè)結(jié)果
GET /my_index/my_type/_search
{
"query": {
"match": { (1)
"title": {
"query": "quick brown fox",
"minimum_should_match": "30%"
}
}
},
"rescore": {
"window_size": 50, (2)
"query": { (3)
"rescore_query": {
"match_phrase": {
"title": {
"query": "quick brown fox",
"slop": 50
}
}
}
}
}
}
1、match查詢決定哪些文檔將包含在最終結(jié)果集中吞滞,并通過(guò)TF/IDF排序佑菩。
2盾沫、window_size是每一分片進(jìn)行重新評(píng)分的頂部文檔數(shù)量。
3殿漠、目前唯一支持的重新打分算法就是另一個(gè)查詢赴精。(舊)
需找相關(guān)詞
短語(yǔ)查詢和鄰近查詢的一個(gè)缺點(diǎn):過(guò)于嚴(yán)格。
即使使用了slop绞幌,得到的單詞順序的靈活性也需要付出代價(jià)蕾哟,失去了單詞對(duì)之間的聯(lián)系。
可以識(shí)別sue啊奄、alligator渐苏、ate
相鄰出現(xiàn)的文檔,但無(wú)法分辨是Sue ate
還是alligator ate
菇夸。
索引單詞對(duì)琼富,能對(duì)這些單詞的上下文盡可能多的保留。
Sue ate the alligator
不僅將每一個(gè)單詞(或者unigram)作為詞項(xiàng)索引["sue", "ate", "the", "alligator"]
也將每個(gè)單詞以及它的鄰近詞作為單個(gè)詞項(xiàng)索引["sue ate", "ate the", "the alligator"]
這些單詞對(duì)(或者biggrams)被成為shingles.
shingles不限于單詞對(duì)庄新,也可以索引三個(gè)單詞(trigrams)
trigrams提供了更高的精度鞠眉,但是也大大增加了索引中唯一詞項(xiàng)的數(shù)量。
只有在用戶輸入的查詢內(nèi)容在原始文檔中順序相同時(shí)择诈,shingles才是有用的械蹋。
生成及使用shingles:https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/blob/cn/120_Proximity_Matching/35_Shingles.asciidoc
性能相關(guān):
shingles不僅比短語(yǔ)查詢更靈活,而且性能也更好羞芍。shingles查詢跟一個(gè)簡(jiǎn)單的match查詢一樣搞笑哗戈,而不用每次搜索花費(fèi)短語(yǔ)查詢的代價(jià)。索引時(shí)會(huì)付出一些小的代價(jià)荷科。