這個(gè)問題遇到過兩次
一次是設(shè)備類型大小寫問題淆攻,數(shù)據(jù)存入的是類似OPPO|VIVI渺杉,但是使用term方式查詢不到跨细,一次是國家編碼的大小寫問題,中國的存儲的編碼是CN躺酒,使用term方式也查詢不到
問題描述:
字段value為text類型押蚤,具體值為國家代碼,比如‘CN’
但是使用term查詢不到
使用match可以查詢到
此處需要精確匹配的查詢羹应,不想被分詞揽碘,具體查了下原因
原因:
1、term查詢不到
使用term要確定的是這個(gè)字段是否“被分析”(analyzed)园匹,默認(rèn)的字符串是被分析的雳刺。創(chuàng)建對應(yīng)的索引之后,通過term查會失敗
[@bjzw_113_167 shell]# curl -X GET http://10.136.12.78:9200/app_hotlist_country/app_hotlist_country/_mapping?pretty
{
"app_hotlist_country" : {
"mappings" : {
"app_hotlist_country" : {
"properties" : {
"app_id" : {
"type" : "keyword"
},
"app_name" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
~
"value" : {
"type" : "text" --------------此處是國家編碼存儲mapping類型
}
}
}
}
}
}
2偎肃、match能查詢到
使用_analyze分析CN煞烫,數(shù)據(jù)存儲是默認(rèn)進(jìn)行了分詞建立索引,查詢時(shí)又進(jìn)行了分詞查詢
[@bjzw_113_167 shell]# curl -H "Content-Type: application/json" -XGET 'http://10.136.12.78:9200/app_hotlist_country/_analyze?pretty' -d '
> {
> "text": "CN"
> }'
{
"tokens" : [
{
"token" : "cn",
"start_offset" : 0,
"end_offset" : 2,
"type" : "<ALPHANUM>",
"position" : 0
}
]
}
解決
1累颂、只是將mapping中type改為keyword
這種方式使用term能查詢到滞详,但是僅限于查詢字符串跟字段完全匹配
"value" : {
"type" : "keyword"
}
2、使用normalizer
The normalizer property of keyword fields is similar to analyzer except that it guarantees that the analysis chain produces a single token.
normalizer 跟analyzer類似紊馏,normalizer特殊的地方是會確定的產(chǎn)生一個(gè)token
The normalizer is applied prior to indexing the keyword, as well as at search-time when the keyword field is searched via a query parser such as the match query or via a term level query such as the term query.
normalizer應(yīng)用在關(guān)鍵字的索引建立之前料饥,或者是通過match或者term查詢的時(shí)候
"settings":{
"analysis":{
"normalizer":{
"my_normalizer":{
"type":"custom",
"filter":["lowercase","asciifolding"]
}
}
}
},
"mappings":{
"type":{
"properties":{
"foo":{
"type":"keyword",
"normalizer":"my_normalizer"
}
}
}
}