美文网首页ElasticSearch实战笔记
19、ElasticSearch 7.x 使用term配合key

19、ElasticSearch 7.x 使用term配合key

作者: 众神开挂 | 来源:发表于2020-04-03 17:54 被阅读0次

    主要内容:使用term配合keyword进行搜索

    1、搜索实战演练

    根据用户ID、是否隐藏、帖子ID、发帖日期来搜索帖子

    1.1、插入一些测试帖子数据
    POST /forum/_bulk
    { "index": { "_id": 1 }}
    { "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2017-01-01" }
    { "index": { "_id": 2 }}
    { "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2017-01-02" }
    { "index": { "_id": 3 }}
    { "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2017-01-01" }
    { "index": { "_id": 4 }}
    { "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2017-01-02" }
    

    ​查看映射

    GET /forum/_mapping
    ## 结果
    {
      "forum" : {
        "mappings" : {
          "properties" : {
            "articleID" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "hidden" : {
              "type" : "boolean"
            },
            "postDate" : {
              "type" : "date"
            },
            "userID" : {
              "type" : "long"
            }
          }
        }
      }
    }
    

    type=text,默认会设置两个field,一个是field本身,比如articleID,就是分词的;还有一个的话,就是field.keyword,articleID.keyword,默认不分词,会最多保留256个字符

    1.2、根据用户ID搜索帖子

    constant_score的用处

    当我们不关心检索词频率TF(Term Frequency)对搜索结果排序的影响时,可以使用constant_score将查询语句query或者过滤语句filter包装起来。

    GET /forum/_search
    {
      "query": {
        "constant_score": {
          "filter": {
            "term": {  ## 使用term搜索
              "userID": 1
            }
          }
        }
      }
    }
    

    term filter/query:对搜索文本不分词,直接拿去倒排索引中匹配,你输入的是什么,就去匹配什么

    1.3、搜索没有隐藏的帖子
    GET /forum/_search
    {
      "query": {
        "constant_score": {
          "filter": {
            "term": {
              "hidden": false
            }
          }
        }
      }
    }
    
    1.4、根据发帖日期搜索帖子
    GET /forum/_search
    {
      "query": {
        "constant_score": {
          "filter": {
            "term": {
              "postDate": "2017-01-01"
            }
          }
        }
      }
    }
    
    1.5、根据帖子ID搜索帖子
    GET /forum/_search
    {
      "query": {
        "constant_score": {
          "filter": {
            "term": {
              "articleID": "XHDK-A-1293-#fJ3"
            }
          }
        }
      }
    }
    

    没有搜到任何的信息,原因参见后面1.6节的分析,需要使用keyword避免分词查询。

    GET /forum/_search
    {
      "query": {
        "constant_score": {
          "filter": {
            "term": {
              "articleID.keyword": "XHDK-A-1293-#fJ3"
            }
          }
        }
      }
    }
    

    articleID.keyword,是ES内置建立的field,当插入articleID的时候,会建立两次索引,一次是自己本身,是要分词的,分词后放入倒排索引;另外一次是基于articleID.keyword,不分词,保留最多256个字符

    所以term filter,对text过滤,可以考虑使用内置的field.keyword来进行匹配。但是有个问题,默认就保留256个字符。所以尽可能还是自己去手动建立索引,指定type=keyword即可。

    1.6、查看分词
    GET /forum/_analyze
    {
      "field": "articleID",
      "text": "XHDK-A-1293-#fJ3"
    }
    

    默认是analyzed的text类型的field,建立倒排索引的时候,就会对所有的articleID分词,分词以后,原本的articleID就没有了,只有分词后的各个word存在于倒排索引中。
    term,是不对搜索文本分词的,XHDK-A-1293-#fJ3 会使用 XHDK-A-1293-#fJ3进行匹配。

    但是articleID建立索引的时候,XHDK-A-1293-#fJ3会分词为 xhdk,a,1293,fj3

    1.7、重建索引
    DELETE /forum
    
    PUT /forum
    {
      "mappings": {
        "properties": {
          "articleID": {
            "type": "keyword"
          }
        }
      }
    }
    

    将1.1中的示例数据插入进来

    1.8、重新根据帖子ID进行搜索
    GET /forum/_search
    {
      "query": {
        "constant_score": {
          "filter": {
            "term": {
              "articleID": "XHDK-A-1293-#fJ3"
            }
          }
        }
      }
    }
    

    这次可以根据keyword正常查询到了

    2、梳理学到的知识点

    (1)term filter:根据exact value进行精确搜索,数字、boolean、date天然支持
    (2)建索引时文本需要指定keyword,才能用term query
    (3)term相当于SQL中的单个where条件

    参考文章:

    Elasticsearch--constant_score_大数据_u014431852的博客-CSDN博客 https://blog.csdn.net/u014431852/article/details/52802747

    相关文章

      网友评论

        本文标题:19、ElasticSearch 7.x 使用term配合key

        本文链接:https://www.haomeiwen.com/subject/jeokuhtx.html