Term 检索针对于精确检索.
Term 应用于字符串时需要特别注意. 原始 text 类型会经过 analyzer 处理, 一般经过分词并转为小写; term 精确匹配, 不做任何转换(包括大小写和空格和符号).
Term 检索不能使用 search_analyzer
.
这会导致, 含有大写字母或者空格或者标点的字符串, 检索结果为空.
解决方案
- 如果查询目的不是精确匹配, 则使用
match
; - 如果的确需要精确匹配, 使用多字段特性
field_name.keyword
.
效率
默认会执行 TF-IDF 算分, 此时可以使用 constant_score
来跳过算分过程.
filter
还能使用缓存.
DELETE /demo
POST /demo/_bulk
{ "index": { "_id": 1 }}
{ "productID" : "XHDK-A-1293-#fJ3","desc":"iPhone" }
{ "index": { "_id": 2 }}
{ "productID" : "KDKE-B-9947-#kL5","desc":"iPad" }
{ "index": { "_id": 3 }}
{ "productID" : "JODL-X-1937-#pV7","desc":"MBP" }
GET /demo/_search
{
"query": {
"term": {
"desc": {
"value": "iphone"
}
}
}
}
GET /demo/_search
{
"query": {
"match": {
"productID": {
"query": "KDKE-B-9947-#kL5"
}
}
}
}
GET /demo/_search
{
"query": {
"term": {
"productID.keyword": {
"value": "KDKE-B-9947-#kL5"
}
}
}
}
GET /demo/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"productID.keyword": "KDKE-B-9947-#kL5"
}
},
"boost": 1.2
}
}
}