laravel 分词搜索匹配度_elasticsearch基础笔记9-elasticsearch 词项全文搜索
es的核心功能就是搜索和分析。那么我們看看搜索相關(guān)內(nèi)容
1、搜索機制
在進入搜索之前,會對查詢體根據(jù)情況進行分析和處理。
2、有哪些常用搜索類型
全文查詢 詞項查詢 復(fù)合查詢 嵌套查詢 位置查詢 特殊查詢等。
我們常用到的就是前三種,學(xué)起來簡單,用起來特別難。
3、看看這三種查詢的區(qū)別。
詞項查詢用來查找指定字段中,包含給定的單詞的文檔,詞項查詢不會被解析,只有查詢詞和文檔中的詞精確匹配才會被搜索到,常見的應(yīng)用場景為地名,人名等。我們的 準(zhǔn)字號。
全文查詢通常用于在全文進行搜索,全文查詢的被查詢字段是要被分析和分解的。
復(fù)合查詢,就是把一些簡單的查詢組合在一起查詢,實現(xiàn)更復(fù)雜的查詢需求,此外,復(fù)合查詢還可以控制另一個查詢的行為。
我們先以term query 和matchquery 來進行對比講解。(下面兩部分第一項)
準(zhǔn)備工作:
我們重新建一個sku索引,加入相應(yīng)的數(shù)據(jù);
然后,我們確認下,新增的數(shù)據(jù)都已經(jīng)存進來了
GET sku/_search
好,接下來我們來看看不同的查詢出來的效果是怎么樣的。
4、詞項查旬
首先,我們查詢下我們剛才錄入的一個文檔,
我們發(fā)現(xiàn),并沒有查到我們剛才存入的數(shù)據(jù),這個就有點尷尬了。
那到底是什么原因呢?在想想我們對詞項查詢的定義,詞項查詢內(nèi)容不會被解析,只有精確匹配到的才會被查詢出來。那我們也就是說,需要我們的sku索引的相應(yīng)字段要精確的匹配到"三黃片"這個詞。那我們我們接下看看看索引字段是怎么存的。分詞之后是什么樣子的。
上面就是"三黃片"這個詞在name這個字段上的分詞結(jié)果。我們發(fā)現(xiàn),分詞結(jié)果是三、黃、片三個單獨的詞,而我們用"三黃片"整個詞來匹配是匹配不到的。
如果我們將我們的搜索詞改為"三",那么應(yīng)該就會匹配到響應(yīng)的數(shù)據(jù)如下:
:
同樣的情況,我們用全文查詢查詢一次看一下效果:參考match query內(nèi)容部分
terms查詢是term的升級版,用來查詢文檔中包含多個詞項,詞項間是或的關(guān)系。
比如,我們查剛才的sku 包含"三","jiaonang"的,會發(fā)現(xiàn)同時查到了兩條記錄。
prefix 查詢用來查詢某個字段中以給定的字段開頭的文檔。
這個查詢中我們發(fā)現(xiàn),對于所查詢的字段,還是用了分詞的。
query
于此類似的還有 wildcard query 為通配符查詢,這個查詢支持單字或者多字的通配符查詢。查詢過程中,用'?'來匹配一個任意字符,'*'用來匹配0個或者多個字符。
exists 查詢會查詢出至少一個非空值的文檔。
5、全文查詢
:
同樣的情況,我們用全文查詢查詢一次看一下效果:
我們會發(fā)現(xiàn),這個時候,無論我們怎么查,都能查到結(jié)果。這就是兩種查詢的區(qū)別。
match查詢會對查詢語句進行分詞,分詞之后查詢語句中任何一個詞項被匹配,文檔就會被搜索到。
如果,想要所有詞項都被搜索到才返回,則使用 and連接。 這就需要改換下寫法(上面的寫法是簡單的寫法)
完成寫法如下:
使用了and連接,也就是對查詢內(nèi)容進行分詞,所有的詞項都被命中后才返回。我們查詢"三皇片"就不會查找到任何內(nèi)容。查詢"三片"就會查找到相應(yīng)內(nèi)容。
對于上面的搜索結(jié)構(gòu)我們可以簡單的分析一下,我們可以把match{}對象中的內(nèi)容表述為這次匹配查詢的參數(shù)(官方:top-level parameters for match)。"field"是要查詢的字段,field{}對象內(nèi)容部,是對field的參數(shù)。
這個參數(shù)可以有很多。具體如下:
query: 你要查詢的內(nèi)容,這個字段是必須的。
analyzer: 分詞器(非必須),在搜索的時候可以制定分詞器,這個時候就會由指定的分詞器來分析你要的關(guān)鍵詞。比如我們把剛才的搜索加上'keyword'分詞,就不會搜到結(jié)果。如果我們不指定分詞器,則會默認使用索引字段設(shè)定好的分詞器。
fuzziness: 允許模糊搜索。 分析出來的關(guān)鍵詞之間允許相隔最大的字符數(shù)量。
max_expansions : 查詢的擴展詞最大數(shù)量。默認為50。
operator :對查詢文本的解析操作類型,包含兩個值:OR AND 。
,
該查詢首先會把要查詢的內(nèi)容分詞,分詞器可以自行定義。同時,文檔內(nèi)容必須滿足兩個條件才能被查詢到:
1、分詞后的所有的詞項都要被命中
2、字段中的詞項和查詢中的詞項順序必須一致。
這里我們用兩個查詢看一下差別,我們用match查詢 查詢 '三片黃',發(fā)現(xiàn)是可以查詢到結(jié)果的。
然后,我們換 match_phrase查詢,則查詢不到結(jié)果,因為分詞后,順序不匹配。
match_phrase_prefix查詢
match_phrase_prefix查詢和 match_phrase比較像,不同的是最后一個詞支持前綴匹配。比如我們查詢'hello world' 這個詞。用 、'hello w'也可以查詢到。
查詢,
multi_match可以看做是match的升級版,用于搜索多個字段。
我們可以再sku索引上增加一個字段,然后,新增一個商品來試驗一下.(為甚不新增一個字段,然后直接修改新增字段這個值?可自己試驗一次),我們發(fā)現(xiàn),在'name'、'fullname'這兩個字段上搜國藥,是可以搜索到結(jié)果的。
同時,multi_match在字段名稱上,還支持通配符查詢。如下:
另外,multi_match在查詢的時候,還可以通過指數(shù)符號指定字段的權(quán)重值。如下查詢,我們會發(fā)現(xiàn)返回的sorce值變大了。
,
常用詞項查詢,算是一種稍微高級點的查詢。所以,想要用好,還是要理解比較多的內(nèi)容。必須解下停止詞(順手可以把同義詞看了)。這個查詢比較適合于停用詞在語境中有重要作用的場景。按照官方例子來說:not 是個常見的停用詞。happy 和 not happy 對比下,not的意義就很重要了。
所以,提供了一種解決方案,把query分詞后的詞項分成了重要詞項和不重要詞項。查詢的時候,先查詢重要詞項。一般來說重要詞項都是低頻詞。然后,在進行高頻詞搜索,這次只計算第一次匹配的文檔評分。
詞項是高頻還是低頻,可以自行通過cutoff_frequency來設(shè)定。
更高深的用法,可參看官方文檔。這個查詢可以很好的適應(yīng)特定領(lǐng)域的停用詞。
,
字符串查詢,是對查詢內(nèi)容按運算規(guī)則進行分析分解的查詢。比如:查詢 "xxxxx AND yyyy "會被分解 query xxxx and query yyyyy的形式。這個查詢支持的參數(shù)非常多,具體參考官方文檔。對es搜索原理非常理解估計才能用的飛起。
這個是可以直接拿來用的字符串查詢,查詢在解析語句的過程中,不會拋出錯誤。用起放心些。
為了能加深意向,大家可多來幾個例子,看到底能不能搜得到:
name: 分詞器: 搜索類型: 搜索:
java編程思想 ik term java 思想 編程思想
總結(jié)
以上是生活随笔為你收集整理的laravel 分词搜索匹配度_elasticsearch基础笔记9-elasticsearch 词项全文搜索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue 计算文件hash值_vue的ha
- 下一篇: c语言入门经典18个程序