美文网首页
基于词项和基与全⽂文的搜索

基于词项和基与全⽂文的搜索

作者: 滴流乱转的小胖子 | 来源:发表于2020-07-15 08:04 被阅读0次

    一、基于Term的查询

    1.1 Term的重要性

    • Term是表达语意的最小单位。
      搜索和利用统计语言模型进行自然语言处理都需要处理Term

    1.2 特点

    • Term Level Query: Term Query / Range Query / Exists Query / Prefix Query / Wildcard Query (通配符)
    • 在ES中,Term查询是,对输入不做分词
      会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行 相关度算分 --- 例如 “APP Store”
    • 可以通过“Constant Score ” 将查询转换成一个Filtering,避免算分,并利用缓存,提高性能

    1.3 关于Term查询例子

    DELETE products
    PUT products
    {
      "settings": {
        "number_of_shards": 1
      }
    }
    
    
    POST /products/_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 /products
    
    POST /products/_search
    {
      "query": {
        "term": {
          "desc": {
            //"value": "iPhone"
            "value":"iphone"
          }
        }
      }
    }
    
    POST /products/_search
    {
      "query": {
        "term": {
          "desc.keyword": {
            "value": "iPhone"
            //"value":"iphone"
          }
        }
      }
    }
    
    
    POST /products/_search
    {
      "query": {
        "term": {
          "productID": {
            "value": "XHDK-A-1293-#fJ3"
          }
        }
      }
    }
    

    1.4 多字段Mapping 和 Term 查询

    • es对text类型数据进行分词,按照Term查询是不分词一个完整整体去查询,所以查询不到text类型字段数据
    • text类型字段会同时定义一个keyword类型(子类型),keyword类型是不分词的,所以使用term查询keyword类型可以查询到数据


      image.png

    1.5 复合查询-- Constant Score 转为 Filter

    • 将Query‘转换成Filter,忽略TF-IDF 计算,避免相关算分开销
    • Filter可以有效的利用缓存


      image.png
    POST /products/_search
    {
      //"explain": true,
      "query": {
        "term": {
          "productID.keyword": {
            "value": "XHDK-A-1293-#fJ3"
          }
        }
      }
    }
    
    
    
    
    POST /products/_search
    {
      "explain": true,
      "query": {
        "constant_score": {
          "filter": {
            "term": {
              "productID.keyword": "XHDK-A-1293-#fJ3"
            }
          }
    
        }
      }
    }
    

    二、基于全文的查询

    2.1 常用全文查询类型

    • Match Query / Match Phrase Query / Query String Query

    2.2 特点

    • 索引和搜索时都会进行分词,查询字符串先传递到一个合适的分词器,然后生成一个供查询的词项列表
    • 查询时候,先会对输入的查询进行分词,然后每个词逐个进行底层的查询,最终将结果进行合并。并为每个文档生成一个算分。
      例如:查“Matrix reloaded”,会查到包括“Matrix” 和 “reloaded” 的所有结果

    2.3 Match Query Result

    image.png

    2.4 Operator 关键词之间的运算符

    image.png

    2.5 Mininum_should_match -- 分词后trem 最小匹配度

    image.png
    https://www.jianshu.com/p/31cd1cd17cbd

    2.6 Match Phrase Query

    image.png

    2.7 Match Query 查询过程

    image.png
    #设置 position_increment_gap
    DELETE groups
    PUT groups
    {
      "mappings": {
        "properties": {
          "names":{
            "type": "text",
            "position_increment_gap": 0
          }
        }
      }
    }
    
    GET groups/_mapping
    
    POST groups/_doc
    {
      "names": [ "John Water", "Water Smith"]
    }
    
    POST groups/_search
    {
      "query": {
        "match_phrase": {
          "names": {
            "query": "Water Water",
            "slop": 100
          }
        }
      }
    }
    
    
    POST groups/_search
    {
      "query": {
        "match_phrase": {
          "names": "Water Smith"
        }
      }
    }
    

    相关阅读

    相关文章

      网友评论

          本文标题:基于词项和基与全⽂文的搜索

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