elasticsearch中的数据类型search_as_you_type及查看底层Lucene索引

这篇具有很好参考价值的文章主要介绍了elasticsearch中的数据类型search_as_you_type及查看底层Lucene索引。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

search_as_you_type字段类型用于自动补全,当用户输入搜索关键词的时候,还没输完就可以提示用户相关内容。as_you_type应该是说当你打字的时候。它会给索引里的这个类型的字段添加一些子字段_2gram _3gram和_index_prefix。_2gram的意思是,如果一个值是abcd, 2 gram就是ab bc cd, 3 gram就是abc bcd cde.先混个眼熟。

先看看这个search_as_you_type怎么用,创建索引:

PUT test_ngram
{
  "mappings": {
    "properties": {
      "title": {
        "type": "search_as_you_type"
      }
    }
  }
}

插入一个文档:

PUT test_ngram/_doc/1
{
 "title":"i am joe"
}

进行搜索:

GET test_ngram/_search
{
  "query": {
    "multi_match": {
      "query": "jo",
      "type": "bool_prefix",
      "fields": [
        "title"
      ]
    }
  }
}

这里的搜索条件是jo,不是一个完整的词,是joe的开头两个字母但是仍然能搜索到结果,分数是1.0,如果搜索 i jo,也能搜索到结果,分数是1.287682,更高,注意这里原来的值是 i am joe,搜索条件是i jo,中间没有am也能搜索,说明是把搜索条件分成了 i 和jo两个单词,即搜索了i也搜索了jo,一个单词 i 匹配评分是1,但是两个单词 i 和 jo都匹配分数就更高,是1.287682,如果jo没有匹配的话分数应该更低,比如你搜索 i oj 分数就是0.2876821

然后我们再来看看三个词的搜索 i am jo ,可以看到分数更高了是1.5753641,说明这三个词都匹配到了,最后一个是前缀匹配,那如果我们搜索 i a jo呢,分数又降低和两个词匹配一样的分数1.287682,说明a并没有匹配到,为什么a不能匹配到am呢,不是前缀匹配吗?这里只能是最后一个单词是前缀匹配,比如这里的 jo,注意是搜索条件里面的最后一个单词不是字段值里面的最后一个单词,你搜索i a分数也是1.287682,也能匹配2个词。

所以结论就是这里会对搜索条件的最后一个词进行前缀匹配(如果是中文的话,不是按空格分词,而是根据ik分词器分词)。

还要注意这里的"type": "bool_prefix",指定了这个参数才能使用前缀匹配,如果去掉这个参数再搜索 jo 是没有结果的。

 文章来源地址https://www.toymoban.com/news/detail-651591.html

然后还有一点这里使用multi_match是为了多字段搜索,所以你可以在fields参数里面多指定几个参数:

"fields": ["title","title._2gram","title._3gram"],这样也能搜索出结果,但是一般都要带上主字段"title",否则搜索不到结果,比如:

GET test_ngram/_search
{
  "query": {
    "multi_match": {
      "query": "wa",
      "type": "bool_prefix", 
      "fields":  ["title._2gram","title._3gram"]
    }
  }
}

这样就搜索不到,要加上主字段title,  "fields": ["title","title._2gram","title._3gram"]就能搜到了。

 

那么前面提到的_2gram _3gram和_index_prefix是怎么回事呢?,也就是了解search_as_you_type的工作原理,这里我们可以打开底层的Lucene索引来具体看看到底这两个字段是怎么回事

那么怎么才能查看es底层的Lucene索引呢,首先有一个工具叫luke,以前是一个独立的项目,github地址是

https://github.com/DmitryKey/luke

但是后来已经合并到Lucene本身里面了,你可以下载Lucene

https://lucene.apache.org/core/downloads.html

这里我用的es版本是7.1.0,下载的Lucene版本是8.7.0,下载的lucene-8.7.0.tgz,(点击Older releases),下载了解压,找到里面的luke文件夹,如果是windows,有一个luke.bat双击就能运行。运行后是一个swing的界面,可以打开Lucene索引,但是相关的Lucene索引在哪呢?

通过es查询:

GET test_ngram

响应里面有一个        "uuid" : "GwxlNOMaRiabTL0BmStlAA",通过它就可以找到索引,比如我这里的位置就是

...\elasticsearch-7.10.1-windows-x86_64\elasticsearch-7.10.1\data\nodes\0\indices\GwxlNOMaRiabTL0BmStlAA

具体位置根据你的设置不同而不同。通过这个地址可以在luke里面打开它,点击open,就选择这个路径,打开后看到如下界面:

elasticsearch中的数据类型search_as_you_type及查看底层Lucene索引

为什么啥也没有呢?好问题。因为es的索引还在缓存中,没有落盘,如何才能让它保存了我们好看呢?调用es的接口:

POST test_ngram/_flush

然后在luke中点击reopen current index,就可以看到有数据。但是这里为了看得更清楚,我们先删除所有文档,再插入一个简单的值:"on",先删除文档:

POST test_ngram/_delete_by_query
{
  "query":{
    "match_all":{}
  }
}

再插入一个文档并flush:

POST test_ngram/_doc/1
{
 "title":"on"
}
POST test_ngram/_flush

然后在luke中点击reopen current index,可以看到

elasticsearch中的数据类型search_as_you_type及查看底层Lucene索引

左边是索引里字段,如果你选择_2gram或者_3gram,然后点击show top terms 你会看到右边是空的,为什么呢,因为这个唯一的文档里面只有一个字段,这个字段的值还只有一个词,所以不会形成2 gram或者3 gram。但是你选择title._index_prefix,再点击show top terms,可以看到上图中显示的,这里在菜单里面点击导出terms,可以看到

o,1
on,1
on ,1
on  ,1

也就是说会在on后面加上两个空格,然后依次是o on on一个空格  on两个空格,所以这就是为什么这里你可以搜索o为前缀的原因,已经有o这个term了,可以直接搜索。

然后为了进一步了解原理,我们更新一下文档,然后flush:

POST test_ngram/_doc/1
{
"title":"on a way"
}
POST test_ngram/_flush

在luke界面里面点击reopen current index, expoert terms,可以看到title._2gram有2个:on a和a way各出现了两次,而title._3gram里面有1个on a way出现了2次,2 gram和3 gram的功能正如本文开头说的那样,但是这里的_2gram和_3gram针对的是单词而不是字母,而导出的title._prefix_index字段如下:

a,2
a ,2
a w,2
a wa,2
a way,2
a way ,2
o,2
on,2
on ,2
on a,2
on a ,2
on a w,2
on a wa,2
on a way,2
w,2
wa,2
way,2
way ,2
way  ,2

可以看出,就是对on a和a way和on a way进行了edge ngrams,edge ngram就是说,如果有一个单词abcde,edge ngram之后就是a ab abc abcd abcde,所以先是得到_2gram和_3gram,再对他们进行edge ngrams,就得到了title._prefix_index。所以这就解释了为什么你前面搜索i a jo后a搜索不到了,因为i am joe进行edge ngrams后是i 和 i a 和 i am 和i am j 和i am jo 和i am joe,就是没有i a jo。

查看官网 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-as-you-type.html 可以了解更多,里面提到你还可以使用_4gram,只要你改变max_shingle_size配置

至此你就知道了search_as_you_type的用法和原理,以及该类型字段包含的子字段_2gram _3gram _prefix_index,还能通过luke工具分析es底层的Lucene索引的真实面目。

 

 
 

到了这里,关于elasticsearch中的数据类型search_as_you_type及查看底层Lucene索引的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【云原生技术】云计算中的数据库管理服务(Database as a Service, DBaaS)简介

    云计算中的数据库管理服务(Database as a Service, DBaaS)是一种托管式服务,它允许用户在云环境中创建、使用和管理数据库,而无需关心底层的硬件、软件或日常维护任务。这些服务通常由云服务提供商提供,如 Amazon Web Services (AWS)、Microsoft Azure 和 Google Cloud Platform (GCP)。 主要

    2024年01月23日
    浏览(13)
  • Elasticsearch Search API之(Request Body Search 查询主体)(1)

    Elasticsearch Search API之(Request Body Search 查询主体)(1)

    “failed”:0 }, “hits”:{ “total”:1, “max_score”:0.2876821, “hits”:[ { “_index”:“map_highlighting_01”, “_type”:“_doc”, “_id”:“erYsbmcBeEynCj5VqVTI”, “_score”:0.2876821, “_source”:{ “context”:“城中西路可以受理外地二代身份证的办理。” }, “highlight”:{ // @1 “context”:[ “城中西

    2024年04月13日
    浏览(14)
  • Elasticsearch报错:search.max_async_search_response_size

    Elasticsearch报错: Can\\\'t store an async search response larger than [10485760] bytes. This limit can be set by changing the [search.max_async_search_response_size] setting. 导致上述问题的原因是,ES默认response的大小是10mb,而返回的值超过了,解决方案,在confgi/下面找到elasticsearch.yml,如果elasticsearch.yml没有定义

    2024年02月11日
    浏览(45)
  • Elasticsearch:Async search API

    Elasticsearch:Async search API

    当我们想要执行持续时间较长的查询时,执行异步操作是一个很好的选择。 在这篇文章中,我们将学习如何管理异步查询。异步操作由 async search API 执行。 异步搜索 API 具有与 _search API 相同的参数,因此你无需构建特殊查询。 在我之前的文章 “Elasticsearch:异步搜索 - as

    2023年04月08日
    浏览(14)
  • elasticsearch 数据类型详解

    此文章已收录至项目 Developer-Knowledge-Base 官方文档:这里这里 常见类型 binary :接受二进制值作为 Base64 编码的字符串。默认情况下,该字段不存储,也不可搜索,不能包含换行符 n boolean :布尔类型,可以接受 true 或 false ,可以使用字符串和直接到布尔类型,空字符串为

    2024年02月04日
    浏览(10)
  • ElasticSearch 之 数据类型

    keyword类型是不进行切分的字符串类型。这里的“不进行切分”指的是: 在索引时,对keyword类型的数据不进行切分,直接构建倒排索引; 在搜索时,对该类型的查询字符串不进行切分后的部分匹配。 keyword类型数据一般用于对文档的过滤、排序和聚合。 在现实场景中,keywo

    2023年04月09日
    浏览(12)
  • ElasticSearch(一)数据类型

    ElasticSearch(一)数据类型

    Es数据类型分为基础数据类型和复杂类型数据,掌握ES数据类型才能进一步使用ES检索数据内容。 2.1.String类型 text:会被分词处理,用于全文检索,很少用于聚合处理(需要设置fielddata属性),不能用于排序 keyword:不可分词,用于精确搜索,过滤、排序、聚合等操作 1分期细粒

    2024年02月11日
    浏览(10)
  • Elasticsearch的数据类型与映射

    Elasticsearch是一个分布式、实时的搜索和分析引擎,它可以处理大量数据并提供快速、准确的搜索结果。在Elasticsearch中,数据类型和映射是两个重要的概念,它们在存储和查询数据时起着关键的作用。本文将深入探讨Elasticsearch的数据类型与映射,揭示其核心概念、算法原理、

    2024年02月19日
    浏览(11)
  • Elasticsearch/Enterprise Search/Kibana安装记录

    Elasticsearch/Enterprise Search/Kibana安装记录

    参考文章:https://www.elastic.co/guide/en/elasticsearch/reference/8.8/deb.html 服务器系统:Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-153-generic x86_64) elasticsearch版本:8.8.2(软件包发行版) 导入 elasticsearch PGP密钥 我们使用 Elasticsearch 签名密钥(PGP 密钥D88E42B4,可从https://pgp.mit.edu获取)和指纹对所有包进行签

    2024年02月16日
    浏览(14)
  • Elasticsearch Search Scroll API(滚动查询)

    Elasticsearch Search Scroll API(滚动查询)

    参考:Elasticsearch Search Scroll API(滚动查询) - 简书 Elasticsearch 中,传统的分页查询使用 from+size 的模式, from 就是页码,从 0 开始。默认情况下,当 (from+1)*size 大于 10000 时,也就是已查询的总数据量大于 10000 时,会出现异常。 如下,用循环模拟一个连续分页查询: 最终当

    2023年04月20日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包