基于詞項(xiàng)term的搜索和基于全文的搜索
ElasticSearch提供了多種搜索方式,包括基于詞項(xiàng)term的搜索和基于全文的搜索。在基于全文的搜索中,查詢串會(huì)被分詞,并將分詞后得到的每個(gè)詞項(xiàng)在索引中進(jìn)行搜索。而基于詞項(xiàng)term的搜索則不對查
ElasticSearch提供了多種搜索方式,包括基于詞項(xiàng)term的搜索和基于全文的搜索。在基于全文的搜索中,查詢串會(huì)被分詞,并將分詞后得到的每個(gè)詞項(xiàng)在索引中進(jìn)行搜索。而基于詞項(xiàng)term的搜索則不對查詢串進(jìn)行分詞,直接進(jìn)行查詢。
創(chuàng)建索引和添加數(shù)據(jù)
首先,我們需要?jiǎng)?chuàng)建一個(gè)名稱為books的索引,并批量加入測試文檔數(shù)據(jù)。下面是創(chuàng)建索引和添加數(shù)據(jù)的命令示例:
```
// 刪除索引
DELETE books
// 創(chuàng)建索引并批量添加數(shù)據(jù)
POST /books/_bulk
{ "index": { "_id":1} }
{ "productId" : "Deep Learn Linux", "desc" : "Linux" }
{ "index": { "_id":2} }
{ "productId" : "Java Thought", "desc" : "Java" }
{ "index": { "_id":3} }
{ "productId" : "Netty Actions", "desc" : "Netty" }
```
基于詞項(xiàng)查詢--單個(gè)詞項(xiàng)匹配查詢
基于詞項(xiàng)查詢的語法結(jié)構(gòu)為:
```
GET /索引名稱/_search
{
"query": {
"term": {
"字段名稱": {
"value": "字段值"
}
}
}
}
```
如果我們根據(jù)字段desc和值"Linux"進(jìn)行查詢,會(huì)發(fā)現(xiàn)沒有獲取到任何結(jié)果。這是因?yàn)樵诩尤胨饕龝r(shí),默認(rèn)會(huì)進(jìn)行分詞處理,并將分詞后的所有詞項(xiàng)轉(zhuǎn)化為小寫。因此,通過"Linux"無法查詢到文檔數(shù)據(jù)。如果我們使用"linux"進(jìn)行查詢,就可以得到相應(yīng)的文檔數(shù)據(jù)。
基于詞項(xiàng)查詢--多個(gè)詞項(xiàng)的字符串匹配查詢
由于基于詞項(xiàng)term的查詢不對查詢串進(jìn)行分詞處理,因此如果查詢串中包含多個(gè)詞項(xiàng),無論如何查詢都不可能匹配到任何文檔數(shù)據(jù)。為了解決這個(gè)問題,可以記住多字段屬性來查詢。例如,text類型屬性默認(rèn)有一個(gè)keyword字段,我們可以使用該字段進(jìn)行查詢。
基于詞項(xiàng)查詢--跳過算分查詢
基于詞項(xiàng)的查詢通常用于精確匹配,因此算分?jǐn)?shù)值并不關(guān)鍵。為了提高查詢效率,我們可以使用constant score將算分過程去掉。特別是對于大數(shù)據(jù)量查詢,這種方式可以顯著提高查詢效率。
以上就是基于詞項(xiàng)term的搜索和基于全文的搜索的相關(guān)知識。通過合理運(yùn)用不同的搜索方式,可以更加靈活地滿足各種搜索需求。