ElasticSearch Term Search

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
    }
  }
}

你可能感兴趣的:(ElasticSearch Term Search)