包含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
快的
快的
-搜索推薦未完成。。。。。。。。。