一、Term query簡介
使用Term query
可以根據(jù)精確值查找相關(guān)文檔數(shù)據(jù),不過Term query
查詢與Match query
查詢還是有區(qū)別的,有時(shí)候你會(huì)發(fā)現(xiàn)用Match query
可以查到,換成Term query
卻不行,本文整理一些使用Term query
容易出錯(cuò)的點(diǎn)供參考。
如果你查看Term query
的官方文檔,你就會(huì)發(fā)現(xiàn),官網(wǎng)首先對(duì)Term query
做了3項(xiàng)明確說明。
- 避免是對(duì)
text
屬性的字段使用Term query
查詢。 -
Elasticsearch
會(huì)因?yàn)榉衷~器的原因改變字段的值,所以如果想要精確匹配text
類型的字段將會(huì)很難。 - 如果查詢
text
類型的字段,建議使用Match query
。
二、Term query和Match query對(duì)比
1. 數(shù)據(jù)準(zhǔn)備
建立一個(gè)索引,其中name
是keyword
類型,full_name
是text
類型。
PUT /test-index
{
"mappings": {
"_doc": {
"properties": {
"name": {
"type": "keyword"
},
"full_name": {
"type": "text"
}
}
}
}
}
插入一條數(shù)據(jù)
PUT /test-index/_doc/1
{
"name":"zhang",
"full_name":"zhang san"
}
2. 使用Match query查詢
查詢name
字段
GET /test-index/_search
{
"query": {
"match": {
"name": "zhang"
}
}
}
可以查詢到結(jié)果
查詢full_name
字段
GET /test-index/_search
{
"query": {
"match": {
"full_name": "zhang san"
}
}
}
同樣也可以查詢到結(jié)果
3. 使用Term query查詢
查詢name
字段
GET /test-index/_search
{
"query": {
"term": {
"name": "zhang"
}
}
}
可以查詢到結(jié)果
查詢full_name
字段
GET /test-index/_search
{
"query": {
"term": {
"full_name": "zhang san"
}
}
}
沒有查到結(jié)果
但是如果你按空格拆開來查詢,比如只查詢zhang
或者san
,是可以查詢到結(jié)果的(Match query拆分后也可以查詢到結(jié)果
)
GET /test-index/_search
{
"query": {
"term": {
"full_name": "zhang"
}
}
}
好了,到此就解釋了為什么官網(wǎng)要做那三項(xiàng)說明,簡單來說就是當(dāng)使用Term query
查詢時(shí),如果是text
類型,會(huì)按照分詞后的結(jié)果來進(jìn)行匹配,而分詞的規(guī)則,如果你掌握不好,那么查詢時(shí)就很容易出錯(cuò)了。
我們也可以驗(yàn)證一下在standard
分詞器下,zhang san
的分詞結(jié)果。
POST _analyze
{
"analyzer": "standard",
"text": "zhang san"
}
可以看到,zhang san
確實(shí)被拆分為了zhang
和san
兩部分。
所以使用Term query
查詢時(shí),如果直接查詢zhang san
是查詢不到結(jié)果的。
三、分詞器修改字段值的場景
我們知道Elasticsearch
的有多種分詞器,你也可以自定義分詞器,所以實(shí)際上在不同的分詞器下,zhang san
可能有不同的拆分方法,就像前面說的,分詞的規(guī)則如果你掌握不好,就會(huì)導(dǎo)致查詢的結(jié)果和你設(shè)想中的結(jié)果不匹配,下面,我們可以來看看默認(rèn)的分詞器standard analyzer
,會(huì)有哪些改變字段值的場景?
1. 刪除大多數(shù)標(biāo)點(diǎn)符號(hào)
POST _analyze
{
"analyzer": "standard",
"text": "hello! zhang san"
}
可以對(duì)比下如果是whitespace
分詞器則可以識(shí)別出標(biāo)點(diǎn)符號(hào)
POST _analyze
{
"analyzer": "whitespace",
"text": "hello! zhang san"
}
可以看到hello!
并沒有被拆分開。
2. 英文大寫轉(zhuǎn)小寫
這是一個(gè)很容易掉坑的地方。
POST _analyze
{
"analyzer": "standard",
"text": "Hello Zhang San"
}
經(jīng)過standard
分詞器后,大寫的英文字母都被轉(zhuǎn)換成了小寫,所以,此時(shí)如果你還是按照Hello
來查詢的話,是不會(huì)查詢到結(jié)果的,這點(diǎn)要特別注意。
3. 超過max_token_length部分單獨(dú)拆分
max_token_length
:最大令牌長度。如果超過此長度,則會(huì)被拆分開。默認(rèn)值為 :255
自定義一個(gè)分詞器,并設(shè)置max_token_length
長度為5。
PUT test-analyzer
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "standard",
"max_token_length": 5
}
}
}
}
}
看一下分詞效果文章來源:http://www.zghlxwxcb.cn/news/detail-501313.html
POST test-analyzer/_analyze
{
"analyzer": "my_analyzer",
"text": "Hello, Elasticsearch"
}
可以看到,拆分后的每一項(xiàng)長度最多不會(huì)超過5。文章來源地址http://www.zghlxwxcb.cn/news/detail-501313.html
到了這里,關(guān)于使用ES Term query查詢時(shí)一定要注意的地方的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!