`
shuminghuang
  • 浏览: 52205 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ElasticSearch 在string类型的字段上做排序出错的解决方案

阅读更多

问题

有个简单的需求:列出图书信息,并按照图书标题的字典顺序排列。

原来认为会很简单:

 

builder.addSort(SortBuilders.fieldSort("title").order(SortOrder.ASC));

 没想到确报这样的异常:

 

Can’t sort on string types with more than one value per doc, or more than one token per field
 

原因分析

 

根据异常信息的提示,有两个可能:

1) 文档里有两个string类型排序的字段

2) 排序的字段里有多个”token“

 

检查索引的文档,没有发现有多个”title“,那只能是第二个原因了。

一个字符串类型的字段,在mapping里通常是这样的:

 

"title":{
    "type":"string"
}

 并没有制定要不要做tokenize,不过看起来Elasticsearch默认是做了tokenize的。这也符合常理,毕竟是要在这个字段上做搜索的。但是做排序的需要也要满足。

还好已经有人提供解决方案了:对title 做 multi mapping (http://blog.wiercinski.net/2011/uncategorized/elasticsearch-sorting-on-string-types-with-more-than-one-value-per-doc-or-more-than-one-token-per-field/)

具体来说就是更改文档的mapping 为:

 

"title" : {
        "type" : "multi_field",
        "fields" : {
          "title" : {
            "type" : "string"
          },
          "untouched" : {
            "type" : "string",
            "index" : "not_analyzed",
            "include_in_all" : false
          }
        }
      }

 在做排序的时候需要调整为:

 

 

builder.addSort(SortBuilders.fieldSort("title.untouched").order(SortOrder.ASC));
 

后续问题 

到此问题应该就已经解决,可是重新调用功能,还是没有按照字典顺序排列。

怀疑是需要重新建立索引的问题。

github上有线程的插件可以重建索引:https://github.com/karussell/elasticsearch-reindex

可惜我使用下来并不顺利。

根据网上的php脚本做了些改动,实现了重建索引的功能,基本思路是这样的:

 

  1. 建立一个新的index
  2. 插入一条数据到新index中
  3. 修改elasticsearch默认生成的mapping
  4. 删除上步插入的记录(保留mapping)
  5. 通过scroll_search从旧index中读出数据到新index中。
  6. 删除旧index,然后重建
  7. 插入一条数据到旧index中
  8. 修改elasticsearch默认生成的mapping
  9. 删除上步插入的记录(保留mapping)
  10. 通过scroll_search从新index中读出数据到旧index中

这样,每个文档的title字段就有两个类型了,一个用于搜索,一个用于排序。

0
1
分享到:
评论
2 楼 50341 2016-01-15  
朋友你好,我现在的问题是,已经有两个了,一个用于IK,一个用于pinyin,如果需要排序的话,是否需要在加一个multi_field?配置为not_analyzed?
1 楼 350530133 2013-09-27  
重建索引的没有必要来回倒腾吧?可以使用aliases来做索引映射。然后内部指定不同的名称如果index_version1,如果需要修改的话,只需要先建立好index_version2的mapping,然后慢慢的将数据从index_version1迁移到index_version2.迁移期间可以同时搜索两个索引。迁移完成后,将alias修改指向index_version2.

相关推荐

    Elasticsearch(015):es常见的字段映射类型之数字类型(numeric)

    文章目录简介示例注意事项 ...#给example索引添加字段映射,默认docs类型 PUT example/docs/_mapping { properties: { id:{ type:long }, name:{ type:keyword }, age:{ type:integer },

    ElasticSearch 可扩展的开源弹性搜索解决方案

     《ElasticSearch 可扩展的开源弹性搜索解决方案》将教你如何构建一个快速、灵活、可扩展的搜索解决方案,通过建立自定义集群进入ElasticSearch的世界。通过学习数据索引和分析,你将掌握ElasticSearch的强大功能,...

    arcgis-elasticSearch-es-矢量数据导入插件-数据建模-mapping-indexsetting-字段映射

    arcgis elasticSearch es 矢量数据导入插件 数据建模 mapping indexsetting 字段映射 索引建模支持geoshape、shape,text索引支持keyword/ngram/edgeNgram/ikSmart,快速导入,兼容multipolygon,带洞,多面,使用时...

    elasticsearch数据结构设计文档

    Elasticsearch 数据结构设计文档是 ES 中的核心概念,用于定义索引的逻辑结构和字段设计。该设计主要包括索引类型别名、索引名称、类型名称、字段名称、字段类型、字段描述等几个方面。同时,该设计还涉及到 ES 的...

    ES之_source字段详解

    在Elasticsearch(以下简称ES)中,_source字段扮演着至关重要的角色。它包含了索引时传递的原始JSON文档体。了解和掌握_source字段的工作原理对于优化查询性能、提高数据检索效率至关重要。 #### 二、_source字段...

    springboot整合elasticsearch7实现es数据同步,查询、相关度排序、高亮显示、自动补全搜索等功能。

    springboot整合elasticsearch7,进行数据同步。elasticsearch相关度查询、排序。高亮显示;自动补全等功能。代码仅供参考,代码中有具体的注释,可以根据代码及注释内容,对自己项目架构及业务进行修改、整合。

    elasticsearch查询模版-模糊查询,多字段查询,相似度计算等

    Elasticsearch(简称ES)是一个基于Apache Lucene构建的开源、分布式、RESTful风格的搜索和数据分析引擎。它允许你以前所未有的速度和规模,即时地存储、搜索和分析大量数据。Elasticsearch通常用于全文搜索、结构化...

    Elasticsearch使用工具类

    在实际开发中,为了方便操作Elasticsearch,开发者通常会封装一些工具类,如"ElasticsearchUtil",以便更高效地执行常见的查询、更新、删除和创建等操作。 ### 查询数据 默认查询通常是基于索引来获取匹配的数据,...

    Elasticsearch Demo 读取word内容写入到Es上并展示在WebFrom页面上

    这包括安装Elasticsearch、创建索引模板、设置映射(mapping),以确定字段类型和分析器等。对于文本内容,可能会使用`standard`或`ik`分词分析器,以便正确地分词和建立倒排索引。 然后是**数据写入Elasticsearch*...

    elasticsearch elasticsearch-6.2.2 elasticsearch-6.2.2.zip 下载

    根据提供的文件信息,...综上所述,Elasticsearch 6.2.2版本在性能、安全性和功能性方面都有所提升,为用户提供了更加稳定可靠的服务。无论是对于开发人员还是运维工程师来说,掌握这一版本的新特性都是非常有帮助的。

    elasticSearch的操作demo

    最后,`es`包可能是Elasticsearch相关的操作接口或抽象类,它们定义了与Elasticsearch交互的方法,如添加、更新、删除文档,以及查询等。例如: ```java public interface ElasticsearchRepository { void save...

    实战Elasticsearch、Logstash、Kibana++分布式大数据搜索与日志挖掘及可视化解决方案

    《实战Elasticsearch、Logstash、Kibana++分布式大数据搜索与日志挖掘及可视化解决方案》这本书涵盖了在大数据环境中如何高效地实现数据搜索、处理、分析以及可视化的关键技术和工具。以下是该书所涉及的核心知识点...

    Hive+经纬度+数据导入ES

    在将Hive中的数据导入到Elasticsearch时,如果Hive表中存在一个表示地理坐标的字段(如`location`),且该字段的类型为`array<double>`,那么直接导入到Elasticsearch后可能会导致该坐标数据无法正常被识别和使用。...

    ElasticSearch官方测试数据

    3. **类型(Type)**:在旧版本的Elasticsearch中,每个索引可以包含多个类型,但在7.x版本后已被移除,所有文档都属于默认的`_doc`类型。 4. **节点(Node)**:运行Elasticsearch实例的服务器称为节点,多个节点...

    Elasticsearch深入学习文档

    5. **支持多种查询类型**:Elasticsearch支持包括结构化查询、全文搜索、地理位置搜索、特殊类型字段查询等多种查询方式。 ### Elasticsearch的核心组件 - **节点(Node)**:Elasticsearch的实例,可以存储数据,...

    Java实体类字段生成工具类-将数据库表列字段转为Java实体类驼峰字段

    1、在Java开发中,常常需要将数据库表列字段换成Java实体类字段。但是手动实现这个转换过程比较慢,且容易出错,影响开发效率。为了解决这个问题,开发了这个Java实体类字段生成工具类。 2、该工具类可以将数据库表...

    springBoot动态操作Elasticsearch组件

    如果我们只想在特定字段上执行模糊查询,可以使用`@Query`注解配合Elasticsearch的查询语法。例如,定义一个方法`@Query("{\"match\":{\"fieldName\":\"?0\"}}") List<MyEntity> findByFixedField(String value)`,...

Global site tag (gtag.js) - Google Analytics