當前位置:成語大全網 - 漢語詞典 - es匹配的使用原則有4 -短語匹配、slop近似匹配、搜索推薦等等。

es匹配的使用原則有4 -短語匹配、slop近似匹配、搜索推薦等等。

匹配查詢,只能搜索到包含java和spark的文檔,但不知道java和spark是否接近。

包含java或spark的文檔,或者包含java和spark的文檔都將被返回。我們真的不知道doc,java和spark哪個更接近。如果我們只是想搜索java spark,並且中間不能插入任何其他字符或者指定中間只能分隔num個字符,此時match可以做全文搜索嗎?答案是,不能。

兩個要求:

1,java spark,靠在壹起,中間不能插入其他字符,所以會搜索出這個doc。

2,java spark,但是要求java和spark這兩個詞越接近,doc得分越高,排名也越高。

短語匹配就是短語匹配,整體查找短語。

3.分詞後的臨時位置

從結果中我們可以看到hello的臨時位置是0,world,java spark的位置依次是1,2,3。

4.短語搜索原理(近似搜索原理也是)

妳好世界,java spark doc1

嗨,spark java doc2

妳好doc1(0)

wolrd doc1(1)

java文檔1(2)文檔2(2)

火花文件1(3)文件2(1)

Java spark-& gt;匹配短語

Java spark-& gt;Java和spark

Java-& gt;文件1(2)文件2(2)

火花-& gt;文件1(3)文件2(1)

要找到每個$ term都有的文檔,妳需要壹個文檔,這個文檔必須包含每個$ term,然後妳才能把它拿出來繼續計算。

doc 1->;Java和spark-& gt;火花位置恰好比java大1->;Java的位置是2,spark的位置是3,剛好符合條件,doc1符合條件。

文檔2 ->Java和spark-& gt;java位置是2,spark位置是1,spark位置比Java位置小1,而不是1->;單獨位置不滿足,則doc2不匹配。

類似的近似搜索原理是壹樣的。

slop是什麽意思?搜索文本,其中有幾個$ term,必須經過幾個步驟才能匹配壹個文檔,並且步驟的數量很大。簡單來說就是交換後java和spark的距離或者java和spark的距離+2(其中2是交換所需的步數)。在slop搜索下,關鍵詞越接近,相關性得分越高。

比如妳搜索壹個java spark,它包含java,或者包含spark,或者兩者都包含,並且盡可能包含java spark的doc,或者java和spark接近,排在第壹位,同時提供召回率和準確率。

直接用短語match_phrase搜索,會導致所有的$ term都必須出現在doc字段,距離在slop範圍內,才能匹配。

這時可以用bool結合match查詢和match_phrase查詢來達到上述效果。

匹配-& gt;只要對壹個$ term進行簡單匹配,就可以理解為結果會返回$ term對應的文檔,掃描倒排索引,掃描了就ok了。

短語匹配-& gt;首先,掃描$ term的所有文檔列表;找到包含所有$ term的文檔列表;然後為每個文檔計算每個$ term的位置,以及它是否滿足指定的範圍;Slop,需要進行復雜的操作,確定是否可以通過slop移動並匹配壹個doc。

匹配查詢的性能遠高於短語匹配和鄰近匹配(帶slop)。因為後兩者要計算位置的距離。

匹配查詢的性能比短語匹配高10倍,比鄰近匹配高20倍。

默認情況下,match可以匹配1000個文檔。近似匹配需要對每個DOC計算壹次,以確定是否可以通過slop匹配,然後貢獻自己的分數。

但很多情況下,匹配後可能有65,438+0,000個文檔。其實用戶大多是按頁面查詢的,所以可能最多只看前幾頁,比如壹頁是10,最多可能看五頁,也就是50頁。

近似匹配只需要通過slop移動匹配前50個文檔,貢獻自己的分數,不需要計算並貢獻全部1000個文檔。

匹配:1000個文檔,其實每個文檔此時都有壹個分數;近似匹配,50強doc,重分重分;讓前50名的doc、$ term例子更接近並領先

1,前綴搜索

C3D0-KD345

C3K5-DFG65

C4I8-UI365

C3->;以上兩個都是搜出來的-& gt;根據字符串的前綴進行搜索

不需要帖子的案例背景,因為比較簡單。用妳手動建立的新索引給大家看看就行了。

2.前綴搜索的原理

前綴查詢不計算相關性分數,與前綴過濾器的唯壹區別是過濾器緩存位集。

例如,掃描整個倒排索引

前綴越短,要處理的doc越多,性能越差。盡量用長前綴搜索。

前綴搜索,是如何執行的?為什麽性能差?

比賽

C3-D0-KD345

C3-K5-DFG65

C4-I8-UI365

全文檢索

每個字符串都需要分段。

c3 doc1,doc2

d0

kd345

k5

dfg65

補體第四成份缺乏

i8

ui365

C3->;掃描倒排索引->;壹旦掃描到c3,就可以停止,因為只有2個文檔有c3,已經找到-& gt;沒有必要繼續尋找其他的$ term

比賽成績往往很高。

如果是前綴搜索,那麽(前綴搜索不是分詞)

C3-D0-KD345

C3-K5-DFG65

C4-I8-UI365

C3->;我先掃描了c3-D0-KD345,很棒。我找到了壹個以C3為前綴的字符串->;還是得繼續搜索,因為後面還有壹個c3-K5-DFG65,可能還有很多其他帶c3前綴的字符串-->;妳掃描了壹個匹配$ term的前綴,

不能停,必須繼續搜索-& gt;直到掃描完整個倒排索引才能完成,所以prefix的性能很差。

3.通配符搜索

類似前綴搜索,功能更強大。

C3D0-KD345

C3K5-DFG65

C4I8-UI365

5個字符-D任意數量的字符5

5?-*5:通配符來表達更復雜的模糊搜索的語義。

?:任何字符

*: 0或任意數量的字符

性能同樣很差,必須掃描整個倒排索引才能ok。

4.常規搜索

C[0-9]。+

[0-9]:指定範圍內的數字。

[a-z]:指定範圍內的字母。

。:壹個字符。

+:前面的正則表達式可以出現壹次或多次。

通配符和regexp,符合前綴原則,都是掃描整個索引,性能很差。

輸入hello w,妳會想到hello world,hello we,hello win,hello wind等等。

原理類似於match_phrase,唯壹不同的是最後壹個$ term用作前綴進行搜索。

妳好是匹配和搜索相應的文件

w作為前綴,將掃描整個倒排索引,找到所有以w開頭的文檔。

然後找到所有的文檔,也就是包含hello和w開頭的字符的文檔。

根據妳的slop來計算,看看能不能讓hello w在slop範圍內匹配到doc中以hello和W開頭的詞的位置。

也可以指定Slop,但是只有最後壹個$ term會被用作前綴

Max_expansions:指定前綴最多匹配多少個$ term,超過這個數目匹配將不再繼續,從而限制了性能。

默認情況下,前綴應該掃描倒排索引中的所有$ term來查找以w開頭的單詞,但這太差了。可以使用max_expansions來限制w前綴最多匹配多少個$ term,這樣就不會繼續搜索倒排索引。

盡量不要用,因為最後壹個前綴總是需要掃描大量的索引,性能可能會比較差,可以用ngram來實現。

ngram是什麽?

快,五個長度的ngram

ngram長度=1,q u i c k

ngram長度=2,qu ui ic ck

ngram長度=3,快速點擊

ngram長度=4,quic uick

ngram長度=5,快速

edgngram是什麽?

快,第壹個字母後是ngram。

q

誇脫(quart的縮寫)

qui

快的

快的

-搜索推薦未完成。。。。。。。。。