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