[Elasticsearch] 邻近匹配 (二) - 多值字段,邻近程度与相关度
多值字段(Multivalue Fields)
在多值字段上使用短語(yǔ)匹配會(huì)產(chǎn)生古怪的行為:
PUT /my_index/groups/1 {"names": [ "John Abraham", "Lincoln Smith"] }執(zhí)行一個(gè)針對(duì)Abraham Lincoln的短語(yǔ)查詢:
GET /my_index/groups/_search {"query": {"match_phrase": {"names": "Abraham Lincoln"}} }令人詫異的是,以上的這份文檔匹配了查詢。
即使Abraham以及Lincoln分屬于name數(shù)組的兩個(gè)人名中。
發(fā)生這個(gè)現(xiàn)象的原因在于數(shù)組在ES中的索引方式。
當(dāng)John Abraham被解析時(shí)。它產(chǎn)生例如以下信息:
- 位置1:john
- 位置2:abraham
然后當(dāng)Lincoln Smith被解析時(shí)。它產(chǎn)生了:
- 位置3:lincoln
- 位置4:smith
換言之,ES對(duì)以上數(shù)組分析產(chǎn)生的詞條列表和解析單一字符串John Abraham Lincoln Smith時(shí)產(chǎn)生的結(jié)果是一樣的。在我們的查詢中。我們查詢鄰接的abraham和lincoln,而這兩個(gè)詞條在索引中確實(shí)存在而且鄰接,因此查詢匹配了。
幸運(yùn)的是,有一個(gè)簡(jiǎn)單的方法來避免這樣的情況。通過position_offset_gap參數(shù),它在字段映射中進(jìn)行配置:
DELETE /my_index/groups/ PUT /my_index/_mapping/groups {"properties": {"names": {"type": "string","position_offset_gap": 100}} }position_offset_gap設(shè)置告訴ES須要為數(shù)組中的每一個(gè)新元素設(shè)置一個(gè)偏差值。因此,當(dāng)我們?cè)偎饕陨系娜嗣麛?shù)組時(shí),會(huì)產(chǎn)生例如以下的結(jié)果:
- 位置1:john
- 位置2:abraham
- 位置103:lincoln
- 位置104:smith
如今我們的短語(yǔ)匹配就無法匹配該文檔了。由于abraham和lincoln之間的距離為100。你必需要加入一個(gè)值為100的slop的值才干匹配。
越近越好(Closer is better)
短語(yǔ)查詢(Phrase Query)僅僅是簡(jiǎn)單地將不含有精確查詢短語(yǔ)的文檔排除在外,而鄰近查詢(Proximity Query) - 一個(gè)slop值大于0的短語(yǔ)查詢 - 會(huì)將查詢?cè)~條的鄰近度也考慮到終于的相關(guān)度_score中。
通過設(shè)置一個(gè)像50或100這種高slop值,你能夠排除那些單詞過遠(yuǎn)的文檔。可是也給予了那些單詞鄰近的文檔一個(gè)更高的分值。
以下針對(duì)quick dog的鄰近查詢匹配了含有quick和dog的兩份文檔,可是給與了quick和dog更加鄰近的文檔一個(gè)更高的分值:
POST /my_index/my_type/_search {"query": {"match_phrase": {"title": {"query": "quick dog","slop": 50 }}} } {"hits": [{"_id": "3","_score": 0.75, "_source": {"title": "The quick brown fox jumps over the quick dog"}},{"_id": "2","_score": 0.28347334, "_source": {"title": "The quick brown fox jumps over the lazy dog"}}] }
使用鄰近度來提高相關(guān)度
雖然鄰近度查詢(Proximity Query)管用,可是全部的詞條都必須出如今文檔的這一要求顯的過于嚴(yán)格了。這個(gè)問題和我們?cè)谌乃阉?Full-Text Search)一章的精度控制(Controlling Precision)一節(jié)中討論過的類似:假設(shè)7個(gè)詞條中有6個(gè)匹配了,那么該文檔或許對(duì)于用戶而言已經(jīng)足夠相關(guān)了,可是match_phrase查詢會(huì)將它排除在外。
相比將鄰近度匹配作為一個(gè)絕對(duì)的要求。我們能夠?qū)⑺?dāng)做一個(gè)信號(hào)(Signal) - 作為眾多潛在匹配中的一員,會(huì)對(duì)每份文檔的終于分值作出貢獻(xiàn)(參考多數(shù)字段(Most Fields))。
我們須要將多個(gè)查詢的分值累加這一事實(shí)表示我們應(yīng)該使用bool查詢將它們合并。
我們能夠使用一個(gè)簡(jiǎn)單的match查詢作為一個(gè)must子句。該查詢用于決定哪些文檔須要被包括到結(jié)果集中。能夠通過minimum_should_match參數(shù)來去除長(zhǎng)尾(Long tail)。
然后我們以should子句的形式加入很多其它特定查詢。每一個(gè)匹配了should子句的文檔都會(huì)添加其相關(guān)度。
GET /my_index/my_type/_search {"query": {"bool": {"must": {"match": { "title": {"query": "quick brown fox","minimum_should_match": "30%"}}},"should": {"match_phrase": { "title": {"query": "quick brown fox","slop": 50}}}}} }毫無疑問我們能夠向should子句中加入其他的查詢,每一個(gè)查詢都用來添加特定類型的相關(guān)度。
轉(zhuǎn)載于:https://www.cnblogs.com/zsychanpin/p/6743593.html
總結(jié)
以上是生活随笔為你收集整理的[Elasticsearch] 邻近匹配 (二) - 多值字段,邻近程度与相关度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: codevs 1043 方格取数 20
- 下一篇: 计算机的基础知识1