elasticsearch7.17.3实现对中文排序

这篇具有很好参考价值的文章主要介绍了elasticsearch7.17.3实现对中文排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

elasticsearch版本:7.17.3
目标:实现对类型为text字段的中文排序

一、用icu分词器对中文排序

注意:

  • 如果字段中既有中文又有英文,会先把中文按字母顺序排序,再排英文

1、安装icu分词器

执行下面命令后,重启es即可

sudo bin/elasticsearch-plugin install analysis-icu

有下面图中内容代表安装成功
icu_collation_keyword,es-java,elasticsearch,大数据,搜索引擎,es-java,es

2、创建索引时增加sort排序内容

下面内容是创建了一个名为es_test的索引内容,其中包含名为fileName字段,以ik分词器分词,排序内容以icu分词器排序

PUT /es_test
{
  "mappings":{
      "properties":{
      "fileName":{
        "type":"text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart",
        "fields": {
          "sort": {
            "type": "icu_collation_keyword",
            "index": false,
            "language": "zh",
            "country": "pinyin"
          }
        }
      }
    }
  }
}

3、es命令方式排序

GET es_test/_search
{
  "sort": [
    {
      "fileName.sort": {
        "order": "desc"
      }
    }
  ]
}

4、java调用的方式排序

这里只写client.search中的内容,要想看如何完整的调用,可以看我此系列的其他文章

SortOptions sortOption = SortOptions.of(_1 -> _1.field(_2 -> _2.field("fileName.sort").order(SortOrder.Desc)));
SearchResponse<Map> search = client.search(_1 -> _1
                            .index(indexName)
                            //es默认返回10000条数据,加上此条配置才能返回全部条数
                            .trackTotalHits(_2 -> _2.enabled(true))
                            //查询参数
                            .query(queryBuilder.build()._toQuery())
                            .from(pageBegin)
                            .size(dto.getPageSize())
                            .sort(sortOption)
                    , Map.class);

二、用pinyin分词器实现中文排序

注意

  • pinyin对数字的排序可能不会太理想
  • 由于fielddata会在内存中加载并存储每个文档的字段数据,以便在排序和聚合等操作中使用,此方式占用内存要更大,尤其是启用了fielddata选项时
  • 可以将"fileName.pinyin"字段的数据类型更改为"keyword"类型,就可以直接对字段进行聚合和排序,而无需使用fielddata(需要注意keyword类型和text类型的区别,根据自己需要确定)

1、安装pinyin分词器

执行以下命令,根据自己的版本对应的修改

bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v7.17.3/elasticsearch-analysis-pinyin-7.17.3.zip

2、创建索引时增加sort相关内容

下面内容是创建了一个名为es_test的索引内容,其中包含名为fileName字段,以ik分词器分词,相当于还创建了一个名为pinyin的字段,用pinyin分词器支持排序功能

PUT /es_test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "ik_max_word": {
          "tokenizer": "ik_max_word"
        },
        "ik_smart": {
          "tokenizer": "ik_smart"
        },
        "pinyin_analyzer": {
          "tokenizer": "my_pinyin"
        }
      },
      "tokenizer": {
        "my_pinyin": {
          "type": "pinyin",
          "keep_separate_first_letter": false,
          "keep_full_pinyin": true,
          "keep_original": true,
          "limit_first_letter_length": 16,
          "lowercase": true,
          "remove_duplicated_term": true,
          "trim_whitespace": true
        }
      }
    }
  },
  "mappings":{
      "properties":{
      "fileName":{
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart",
        "fields": {
          "pinyin": {
            "type": "text",
            "analyzer": "pinyin_analyzer",
            "fielddata":true
          }
        }
      }
    }
  }
}

3、es命令方式排序

POST es_test/_search
{
  "sort": [
    {
      "fileName.pinyin": {
        "order": "asc"
      }
    }
  ]
}

4、java调用的方式排序

这里只写client.search中的内容,要想看如何完整的调用,可以看我此系列的其他文章

SortOptions sortOption = SortOptions.of(_1 -> _1.field(_2 -> _2.field("fileName.pinyin").order(SortOrder.Desc)));
SearchResponse<Map> search = client.search(_1 -> _1
                            .index(indexName)
                            //es默认返回10000条数据,加上此条配置才能返回全部条数
                            .trackTotalHits(_2 -> _2.enabled(true))
                            //查询参数
                            .query(queryBuilder.build()._toQuery())
                            .from(pageBegin)
                            .size(dto.getPageSize())
                            .sort(sortOption)
                    , Map.class);

尾声

还有其他的支持中文排序的实现方式,比如用smartcn分词器或者jieba分词器,具体大家可以自己多多尝试尝试文章来源地址https://www.toymoban.com/news/detail-799101.html

到了这里,关于elasticsearch7.17.3实现对中文排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Linux环境安装配置Elasticsearch7.17

    服务器环境为CentOS7.6,Elasticsearch版本为7.17.4 2.1 下载 选择要安装的版本:下载地址 解压到指定目录 重命名为es 2.2 创建ES用户 Elasticsearch不允许用root身份启动,所以要新建一个用户并授予权限 2.3 修改ES配置文件 修改ES的核心配置文件 在文件末尾添加以下几行 修改内存参数配

    2024年02月06日
    浏览(39)
  • docker部署Elasticsearch7.17集群和kibana

    环境准备: 3台centos7.9的服务器 vim /etc/sysctl.conf添加:vm.max_map_count=262144 sysctl -w vm.max_map_count=262144 即时生效 cat /proc/sys/vm/max_map_count 查看 #创建es配置目录 mkdir /home/es/config -p #创建es数据目录 mkdir /home/es/data #创建es插件目录 mkdir /home/es/plugins #授权目录 chmod -R 777 /home/es 在/home/e

    2024年02月10日
    浏览(52)
  • elasticSearch7版本文档中文属性模糊查询不准确

    1、问题:es文档中的某个属性值name的值如下所示 name\\\":\\\"catalog=Catalog(value=699015935012372480, displayName=/默认分组), status=3, updaterName=admin, updateTime=2023-02-01 14:33:17)status:已发布” 通过java模糊查询的api(QueryBuilders.fuzzyQuery)查询name为“已”的时候可以查询,查询为“已发布”的时候查

    2024年02月02日
    浏览(55)
  • 【软件安装教程】elasticsearch7.17安装设置用户名和密码

    链接:https://pan.baidu.com/s/1f3jTc4kaQvu_i9pVbuXdPQ  提取码:l3g1  下载后解压    bin :存入一些二进制脚本,包括启动 ES、安装插件命令等都在这里。 config :存放 ES 的配置文件,主要是 elasticsearch.yml 。 jdk :ES 自带的 Java 环境,所以我们无需自己安装 Java 环境。 lib :存放 ES 相关

    2024年02月13日
    浏览(64)
  • Elasticsearch7.8.0版本进阶——IK中文分词器

    通过 Postman 发送 GET 请求查询分词效果,在消息体里,指定要分析的文本 输出结果如下: 由上图输出结果可知,ES 的默认分词器无法识别中文中测试、单词这样的词汇,而是简单的将每个字拆完分为一个词,这样的结果显然不符合我们的使用要求,所以我们需要下载 ES 对应

    2024年02月01日
    浏览(46)
  • ElasticSearch:centos7安装elasticsearch7,kibana,ik中文分词器,云服务器安装elasticsearch

    系统:centos7 elasticsearch: 7.17.16 安装目录:/usr/local 云服务器的安全组:开放 9200 和5601的端口 1、安装 2、修改es的配置文件 注意:es集群启动后,所有节点的cluster.initial_master_nodes: [\\\"node-1\\\"] 都要注释掉。 3、修改jvm.options 可能出现报错 1、配置elasticsearch.yml   错误内容 : the de

    2024年02月03日
    浏览(54)
  • ElasticSearch7.3学习(二十二)----Text字段排序、Scroll分批查询场景解析

    场景:数据库中按照某个字段排序,sql只需写order by 字段名即可,如果es对一个 text field 进行排序,es中无法排序。因为文档入倒排索引表时,分词存入,es无法知道此字段的真实值。这样的结果往往不准确,因为分词后是多个单词,再排序就不是我们想要的结果了。 通常有两

    2024年02月08日
    浏览(43)
  • Elasticsearch7.15.2 安装ik中文分词器后启动ES服务报错的解决办法

    下载elasticsearch ik中文分词器,在elasticsearch安装目录下的plugins文件夹下创建名为ik的文件夹,将下载的ik中文分词器解压缩到新建的ik文件夹下,再次运行 ./bin/elasticsearch启动ES服务时出现以下错误: Exception in thread \\\"main\\\" java.nio.file.NotDirectoryException: /Users/amelia/work/elasticsearch-7.1

    2024年02月12日
    浏览(60)
  • SkyWalking+ElasticSearch7实现日志追踪

    国内es下载地址 修改elasticsearch-env ,elasticsearch7 先去获取本地的jdk 如果jdk 环境不存在则会使用 elasticsearch-7.8.0/jdk 下的jdk ,因为小编本地jdk版本为1.8 运行时会报错 future versions of Elasticsearch will require Java 11; your Java version from [/data/jdk1.8.0_111/jre] does not meet this requirement 因此我们

    2024年02月06日
    浏览(38)
  • 本地部署Canal笔记-实现MySQL与ElasticSearch7数据同步

    本地搭建canal实现mysql数据到es的简单的数据同步,仅供学习参考 建议首先熟悉一下canal同步方式:https://github.com/alibaba/canal/wiki 本地搭建MySQL数据库 本地搭建ElasticSearch 本地搭建canal-server 本地搭建canal-adapter 本地环境为window11,大部分组件采用docker进行部署,MySQL采用8.0.27, 推荐

    2024年02月02日
    浏览(58)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包