问题
有个简单的需求:列出图书信息,并按照图书标题的字典顺序排列。
原来认为会很简单:
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字段就有两个类型了,一个用于搜索,一个用于排序。
分享到:
相关推荐
《ElasticSearch 可扩展的开源弹性搜索解决方案》将教你如何构建一个快速、灵活、可扩展的搜索解决方案,通过建立自定义集群进入ElasticSearch的世界。通过学习数据索引和分析,你将掌握ElasticSearch的强大功能,...
文章目录简介示例注意事项 ...#给example索引添加字段映射,默认docs类型 PUT example/docs/_mapping { properties: { id:{ type:long }, name:{ type:keyword }, age:{ type:integer },
springboot整合elasticsearch7,进行数据同步。elasticsearch相关度查询、排序。高亮显示;自动补全等功能。代码仅供参考,代码中有具体的注释,可以根据代码及注释内容,对自己项目架构及业务进行修改、整合。
Elasticsearch的source字段详解,带图说明;总结性的文档。
ElasticSearch启动之后自己Killed解决方案.docx
1、在Java开发中,常常需要将数据库表列字段换成Java实体类字段。但是手动实现这个转换过程比较慢,且容易出错,影响开发效率。为了解决这个问题,开发了这个Java实体类字段生成工具类。 2、该工具类可以将数据库表...
arcgis elasticSearch es 矢量数据导入插件 数据建模 mapping indexsetting 字段映射 索引建模支持geoshape、shape,text索引支持keyword/ngram/edgeNgram/ikSmart,快速导入,兼容multipolygon,带洞,多面,使用时...
在Elasticsearch中,节点的类型主要有4种: master节点: 配置文件中node.master属性为true(默认为true),就有资格被选为master节点。 master节点用于控制整个集群的操作。比如创建或删除索引,管理其它非master...
《ElasticSearch:可扩展的开源弹性搜索解决方案》前两章着重介绍了ElasticSearch 的基本功能和用法,包括ElasticSearch 的安装和配置、REST API 的使用方法,以及怎样使用Query DSL 语句进行查询、过滤、排序等。...
完美解决distinct中使用多个字段的方法,完美解决distinct中使用多个字段的方法完美解决distinct中使用多个字段的方法完美解决distinct中使用多个字段的方法完美解决distinct中使用多个字段的方法
(狂神)ElasticSearch快速入门笔记,ElasticSearch基本操作以及爬虫(Java-ES仿京东实战),包含了小狂神讲的东西,特别适合新手学习,笔记保存下来可以多看看。好记性不如烂笔头哦~,ElasticSearch,简称es,es是一个...
实战Elasticsearch、Logstash、Kibana++分布式大数据搜索与日志挖掘及可视化解决方案
elasticsearch elasticsearch-6.2.2 elasticsearch-6.2.2.zip 下载
3、Elasticsearch字段类型推荐:介绍 Elasticsearch 支持的多种字段类型,根据查询场景的特点和需求,选择最合适的类型的原则和建议,包括keyword/text/wildcard/long 类型等,以及分词器、查询方式等相关使用方法的...
ElasticSearch:可扩展的开源弹性搜索解决方案
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索...
Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监控堆栈。 Elasticsearch 为所有类型的数据提供近乎实时的...
elasticsearch-8.2.3 windows 版本。 Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的...
一般来说我们开发Elasticsearch会选择使用集成springboot,在网上找的springboot集成elasticsearch文章几乎都是extends ElasticsearchRepository的方式来实现。但是新版本ElasticsearchRepository里的方法基本上已经...