首页 > 其他分享 >Elastic学习之旅 (8) 深入词项和全文搜索

Elastic学习之旅 (8) 深入词项和全文搜索

时间:2024-04-09 09:03:20浏览次数:19  
标签:Term Elastic 之旅 查询 query Query POST 词项 ES

大家好,我是Edison。

上一篇:Elastic学习之旅 (7) 聚合分析

相信很多童鞋和我一样,有点傻傻分不清Term查询和全文查询的区别,那么今天我们就来一起梳理一下。

基于Term的查询

Term(词项)是ES中表达语义的最小单位,搜索和利用统计语言模型进行自然语言处理都需要处理Term。

ES中Term Query包含了: 

Term Query / Range Query / Exist Query / Prefix Query / Wildcard Query

ES中Term的特点:

特点1:在ES中,Term查询对输入不做分词。换句话说,它会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行相关度算分 - 例如“Apple Store”。

可能上面有点难理解,现在我们通过一个实例来理解。

首先,我们先插入几条示例数据:

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": "J0DL-X-1937-#pV7", "desc":"MBP"}

然后,我们通过以下Term Query查询desc为iPhone的记录:

POST /products/_search
{
  "query":{
    "term": {
      "desc": {
        "value": "iPhone"
      }
    }
  }
}

当你执行这条查询后,你会发现,ES居然没有查到这条记录,明明我们刚刚插入的就是它啊!

别急,这恰恰是因为Term查询不对输入做分词,会将输入作为一个整体,进而导致我们搜索不到。
我们进一步将上面的查询改为以下方式就可以查询到记录:将iPhone改为全小写的iphone即可。

POST /products/_search
{
  "query":{
    "term": {
      "desc": {
        "value": "iphone" 
      }
    }
  }
}

同时,如果我们想实现一个精确匹配,我们可以使用term的keyword关键字来实现,如下查询所示:精确匹配一个productID。这也说明,在ES中通过keyword关键字查询,它也不会做分词处理。

POST /products/_search
{
  "query":{
    "term": {
      "productID.keyword": {
        "value": "XHDK-A-1293-#fJ3"
      }
    }
  }
}

我们还会发现,Term查询会返回一个算分:0.9808292,代表匹配的精准度。

特点2:可以使用Constant Score将查询转换成一个Filtering,避免算分,并利用缓存,提高性能。

刚刚提到ES会在倒排索引中进行相关性算分,这在一定程度上会带来一些查询上的开销。我们可以通过ConstantScore将Query转成Filter,来避免相关性算分的开销,还可以有效利用缓存,提高查询的效率!

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

查询结果显示也可以证明它会跳过算分步骤:

基于全文的查询

基于全文的查询,ES提供了以下Query(我们在第6篇Query DSL中学习的就是全文查询):

Match Query / Match Phrase Query / Query String Query

基于全文的查询具有以下的特点:

特点1:索引和搜索时都会进行分词,查询字符串先传到一个合适的分词器,然后生成一个待查询的词项列表。

特点2:查询会对每个词项进行底层的查询,再将结果进行合并,还会为每个文档生成一个算分。

针对这两个特点,我们通过一个示例来串一下:

例如,查询“Matrix reloaded”,会查到包括Matrix或者reload的所有结果。

首先,构建一个Match Query:

POST /movies/_search
{
  "query": {
    "match": {
      "title": {
        "query": "Matrix reloaded"
      }
    }
  }
}

ES会返回title字段中包括Matrix 或者 reloaded的所有记录:

其次,如果你希望查询title字段中同时包含Matrix reloaded,那你可以修改默认的operator为AND来提高精准度:

POST /movies/_search
{
  "profile": "true", 
  "query": {
    "match": {
      "title": {
        "query": "Matrix reloaded",
        "operator": "AND"
      }
    }
  }
}

然后,如果你希望查询的是只要出现Matrix 和 reloaed,其中间可以间隔一些单词,那么你也可以使用match phrase 和 slop参数设置分词出现的最大间隔距离:

POST /movies/_search
{
  "profile": "true", 
  "query": {
    "match_phrase": {
      "title": {
        "query": "Matrix reloaded",
        "slop": 1
      }
    }
  }
}

最后,这个基于全文的查询在ES中的基本查询过程如下所示:

小结

本篇,我们了解了ElasticSearch的Term和全文查询的基本概念及其特点,利用这些特点在指定的场景会有是事半功倍的效果!

参考资料

极客时间,阮一鸣,《ElasticSearch核心技术与实战

 

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

标签:Term,Elastic,之旅,查询,query,Query,POST,词项,ES
From: https://www.cnblogs.com/edisonchou/p/-/edc_elastic_study_notes_chap08

相关文章

  • C++奇迹之旅:我与类和对象相遇
    文章目录......
  • linux 环境下 elasticsearch 及 python 相关库的使用
    -elasticsearch是什么?elasticsearch简称es,是一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能。-安装1、下载官网下载地址2、解压tarzxvfelasticsearch-8.13.0-linux-x86_64.tar.gz-C/usr/local/3、解决JDK依赖问题新版本的es压缩......
  • 《0 基础开启信息安全之旅,带你洞察未来趋势!》
    在这个数字化的时代,信息安全变得至关重要。即使你是零基础,也无需担心,因为每个人都可以踏上信息安全的学习之路。本文将为你提供一份全面的指南,帮助你从零开始,逐步深入信息安全的世界。一、明确学习目标确定你想要达到的目标,是成为专业的信息安全专家,还是仅仅了解基本的信......
  • elasticsearch-head的安装和使用
    一、elasticsearch-head插件介绍elasticsearch-head是elasticsearch的一款可视化工具,依赖于node.js,所以需要先安装node.js二、安装Node.js详情见文章nodejs安装和使用三、安装Grunt这一步可不做#Grunt是基于Node.js的项目构建工具。grunt作为一个前端构建工具,有资源......
  • Elasticsearch 配置与测试分析器 (2)
    一.配置文本分析器(Configuretextanalysis) 默认情况下,Elasticsearch使用standard分析器来进行文本分析,如果使用该分析器,则不用额外的配置。如果不满足,可以使用其它内置分析器,也可以创建自定义的分析器更好的控制,通常在生产实战中都是自定义分析器,方便更好扩展。 ......
  • Elasticsearch,使用scroll实现遍历(分页)查询
    为什么要使用scroll查询在使用es中,当某个index存贮的数据超过10000时,只能查询到10000的数据。因为index.max_result_window默认值是10000。并且使用游标查询可以在一次查询中获取大量文档,并且保持查询快照状态,允许用户多次检索数据而不影响其他并发请求。scroll查......
  • elasticsearch mapping
    1 概念:​ ES中的mapping有点类似与RDB中“表结构”的概念,在MySQL中,表结构里包含了字段名称,字段的类型还有索引信息等。在Mapping里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性,并且在ES中一个字段可以有对个类型。分词器、评分等概念在......
  • Python-VBA函数之旅-abs()函数
            abs函数是绝对值函数(absolutevaluefunction)的缩写,在编程中有多种实际应用场景,因为它能够方便地处理需要忽略数值符号的情况。常见的应用场景有:1、数值处理:在数据分析和科学计算中,经常需要处理各种数值。使用abs函数可以确保获得的数值是非负的,从而避免产......
  • Elasticsearch 认识分词(1)
    一.概述分词是构建倒排索引的重要一环。根据语言不同可以分为英文分词、中文分词等;根据分词实现的不同又分为标准分词器、空格分词器、停用词分词器等。在传统的分词器不能解决特定业务场景的问题时,往往需要自定义分词器。1.1认识分词对于分词操作来说,英语单词......
  • Elasticsearch-定制分词器
    一、内置分词器分词步骤1).characterfilter:在一段文本进行分词之前,先进行预处理,eg:最常见的过滤html标签(hello->hello),&->and(I&you->Iandyou)2).tokenizer:分词,eg:helloyouandme->hello,you,and,me3).tokenfilter:一个个小单词标准化转换lower......