问题
有个简单的需求:列出图书信息,并按照图书标题的字典顺序排列。
原来认为会很简单:
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脚本做了些改动,实现了重建索引的功能,基本思路是这样的:
- 建立一个新的index
- 插入一条数据到新index中
- 修改elasticsearch默认生成的mapping
- 删除上步插入的记录(保留mapping)
- 通过scroll_search从旧index中读出数据到新index中。
- 删除旧index,然后重建
- 插入一条数据到旧index中
- 修改elasticsearch默认生成的mapping
- 删除上步插入的记录(保留mapping)
- 通过scroll_search从新index中读出数据到旧index中
这样,每个文档的title字段就有两个类型了,一个用于搜索,一个用于排序。
分享到:
相关推荐
文章目录简介示例注意事项 ...#给example索引添加字段映射,默认docs类型 PUT example/docs/_mapping { properties: { id:{ type:long }, name:{ type:keyword }, age:{ type:integer },
《ElasticSearch 可扩展的开源弹性搜索解决方案》将教你如何构建一个快速、灵活、可扩展的搜索解决方案,通过建立自定义集群进入ElasticSearch的世界。通过学习数据索引和分析,你将掌握ElasticSearch的强大功能,...
arcgis elasticSearch es 矢量数据导入插件 数据建模 mapping indexsetting 字段映射 索引建模支持geoshape、shape,text索引支持keyword/ngram/edgeNgram/ikSmart,快速导入,兼容multipolygon,带洞,多面,使用时...
Elasticsearch 数据结构设计文档是 ES 中的核心概念,用于定义索引的逻辑结构和字段设计。该设计主要包括索引类型别名、索引名称、类型名称、字段名称、字段类型、字段描述等几个方面。同时,该设计还涉及到 ES 的...
在Elasticsearch(以下简称ES)中,_source字段扮演着至关重要的角色。它包含了索引时传递的原始JSON文档体。了解和掌握_source字段的工作原理对于优化查询性能、提高数据检索效率至关重要。 #### 二、_source字段...
springboot整合elasticsearch7,进行数据同步。elasticsearch相关度查询、排序。高亮显示;自动补全等功能。代码仅供参考,代码中有具体的注释,可以根据代码及注释内容,对自己项目架构及业务进行修改、整合。
Elasticsearch(简称ES)是一个基于Apache Lucene构建的开源、分布式、RESTful风格的搜索和数据分析引擎。它允许你以前所未有的速度和规模,即时地存储、搜索和分析大量数据。Elasticsearch通常用于全文搜索、结构化...
在实际开发中,为了方便操作Elasticsearch,开发者通常会封装一些工具类,如"ElasticsearchUtil",以便更高效地执行常见的查询、更新、删除和创建等操作。 ### 查询数据 默认查询通常是基于索引来获取匹配的数据,...
这包括安装Elasticsearch、创建索引模板、设置映射(mapping),以确定字段类型和分析器等。对于文本内容,可能会使用`standard`或`ik`分词分析器,以便正确地分词和建立倒排索引。 然后是**数据写入Elasticsearch*...
根据提供的文件信息,...综上所述,Elasticsearch 6.2.2版本在性能、安全性和功能性方面都有所提升,为用户提供了更加稳定可靠的服务。无论是对于开发人员还是运维工程师来说,掌握这一版本的新特性都是非常有帮助的。
最后,`es`包可能是Elasticsearch相关的操作接口或抽象类,它们定义了与Elasticsearch交互的方法,如添加、更新、删除文档,以及查询等。例如: ```java public interface ElasticsearchRepository { void save...
《实战Elasticsearch、Logstash、Kibana++分布式大数据搜索与日志挖掘及可视化解决方案》这本书涵盖了在大数据环境中如何高效地实现数据搜索、处理、分析以及可视化的关键技术和工具。以下是该书所涉及的核心知识点...
在将Hive中的数据导入到Elasticsearch时,如果Hive表中存在一个表示地理坐标的字段(如`location`),且该字段的类型为`array<double>`,那么直接导入到Elasticsearch后可能会导致该坐标数据无法正常被识别和使用。...
3. **类型(Type)**:在旧版本的Elasticsearch中,每个索引可以包含多个类型,但在7.x版本后已被移除,所有文档都属于默认的`_doc`类型。 4. **节点(Node)**:运行Elasticsearch实例的服务器称为节点,多个节点...
5. **支持多种查询类型**:Elasticsearch支持包括结构化查询、全文搜索、地理位置搜索、特殊类型字段查询等多种查询方式。 ### Elasticsearch的核心组件 - **节点(Node)**:Elasticsearch的实例,可以存储数据,...
1、在Java开发中,常常需要将数据库表列字段换成Java实体类字段。但是手动实现这个转换过程比较慢,且容易出错,影响开发效率。为了解决这个问题,开发了这个Java实体类字段生成工具类。 2、该工具类可以将数据库表...
如果我们只想在特定字段上执行模糊查询,可以使用`@Query`注解配合Elasticsearch的查询语法。例如,定义一个方法`@Query("{\"match\":{\"fieldName\":\"?0\"}}") List<MyEntity> findByFixedField(String value)`,...