问题
有个简单的需求:列出图书信息,并按照图书标题的字典顺序排列。
原来认为会很简单:
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 },
arcgis elasticSearch es 矢量数据导入插件 数据建模 mapping indexsetting 字段映射 索引建模支持geoshape、shape,text索引支持keyword/ngram/edgeNgram/ikSmart,快速导入,兼容multipolygon,带洞,多面,使用时...
Elasticsearch 数据结构设计文档是 ES 中的核心概念,用于定义索引的逻辑结构和字段设计。该设计主要包括索引类型别名、索引名称、类型名称、字段名称、字段类型、字段描述等几个方面。同时,该设计还涉及到 ES 的...
在Elasticsearch(以下简称ES)中,_source字段扮演着至关重要的角色。它包含了索引时传递的原始JSON文档体。了解和掌握_source字段的工作原理对于优化查询性能、提高数据检索效率至关重要。 #### 二、_source字段...
ElasticSearch 可扩展的开源弹性搜索解决方案
springboot整合elasticsearch7,进行数据同步。elasticsearch相关度查询、排序。高亮显示;自动补全等功能。代码仅供参考,代码中有具体的注释,可以根据代码及注释内容,对自己项目架构及业务进行修改、整合。
在实际开发中,为了方便操作Elasticsearch,开发者通常会封装一些工具类,如"ElasticsearchUtil",以便更高效地执行常见的查询、更新、删除和创建等操作。 ### 查询数据 默认查询通常是基于索引来获取匹配的数据,...
Elasticsearch(简称ES)是一个基于Apache Lucene构建的开源、分布式、RESTful风格的搜索和数据分析引擎。它允许你以前所未有的速度和规模,即时地存储、搜索和分析大量数据。Elasticsearch通常用于全文搜索、结构化...
这包括安装Elasticsearch、创建索引模板、设置映射(mapping),以确定字段类型和分析器等。对于文本内容,可能会使用`standard`或`ik`分词分析器,以便正确地分词和建立倒排索引。 然后是**数据写入Elasticsearch*...
- **Nest**(.NET Elasticsearch Client):是.NET平台上的官方客户端,提供了一种类型安全的方式与Elasticsearch交互。 **2. Elasticsearch可视化工具** 为了便于理解和管理ES中的数据,可视化工具起着至关重要的...
根据提供的文件信息,...综上所述,Elasticsearch 6.2.2版本在性能、安全性和功能性方面都有所提升,为用户提供了更加稳定可靠的服务。无论是对于开发人员还是运维工程师来说,掌握这一版本的新特性都是非常有帮助的。
最后,`es`包可能是Elasticsearch相关的操作接口或抽象类,它们定义了与Elasticsearch交互的方法,如添加、更新、删除文档,以及查询等。例如: ```java public interface ElasticsearchRepository { void save...
《实战Elasticsearch、Logstash、Kibana++分布式大数据搜索与日志挖掘及可视化解决方案》这本书涵盖了在大数据环境中如何高效地实现数据搜索、处理、分析以及可视化的关键技术和工具。以下是该书所涉及的核心知识点...
在IT领域,尤其是在大数据分析和实时检索的场景中,Elasticsearch(ES)因其高效、灵活的特性,已经成为一种广泛使用的工具。本文将深入探讨在处理大宽表应用中的实践案例,以及面临的挑战和解决方案。 首先,我们...
1. **Easy-Es**:这是一个简化 Elasticsearch 操作的工具,支持自定义排序、权重和原生查询,提供了更多的定制空间。 2. **es-client**:开源的可视化工具,提供数据浏览、查询、索引过滤等功能,支持多集群连接,且...
3. **类型(Type)**:在旧版本的Elasticsearch中,每个索引可以包含多个类型,但在7.x版本后已被移除,所有文档都属于默认的`_doc`类型。 4. **节点(Node)**:运行Elasticsearch实例的服务器称为节点,多个节点...
动态映射是指在文档写入 Elasticsearch 时,会根据文档字段自动识别类型,而静态映射是指事先定义好映射,包含文档的各个字段及其类型等。 三、文档 文档是用来搜索的数据,其中的每一条数据就是一个文档。 四、...