Spring Boot & Elasticsearch 自定义查询结果排序

记一下调查查询结果排序的结果,以供今后参考。

首先是参考这篇博客使用 FunctionScoreQuery 实现自定义分值的方案。

指定 Elasticsearch 6 的默认分片数和副本数

ES6 及之后都是通过索引模板来实现这个功能的,但是 ES6 对应的 Kibana 上没有对应的页面,需要通过发送 HTTP 请求来设置。

网上大多是通过 curl 命令,可惜 Windows 中没有这个命令。

curl -XPUT 'http://10.27.12.16:9200/_template/template_http_request_record' -H 'Content-Type: application/json' -d '{"index_patterns": ["record_*"],"settings": {"number_of_shards": 1,"number_of_replicas": 0}}'
ElasticsearchRepository 查询时返回指定的字段

索引中的字段太多,但是只需要其中的部分字段时,可以通过 ElasticsearchRepository 中的 Page<T> search(SearchQuery searchQuery); 方法配合 NativeSearchQueryBuilder 来实现。

org.elasticsearch.search.query.QueryPhaseExecutionException

当查询结果超过 10000 且当前页含 10000 条之后的数据时,报了如下错误:

Caused by: org.elasticsearch.search.query.QueryPhaseExecutionException: Result window is too large, from + size must be less than or equal to: [10000] but was [100000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting.

Elasticsearch 5.5 测试 smartcn 分析器

通过 curl 工具可以测试 smartcn 分析器的分词效果(如何安装 smartcn 分析器请参考 这篇博客)。

Elasticsearch 5.x 安装 Head 插件

由于 for Elasticsearch 5.x, 6.x, and 7.x: site plugins are not supported. (摘自 elasticsearch-head 的 GitHub 文档) ,所以没法像 2.0 版的安装方法 那样安装 Head 插件了。

Elasticsearch 5.5 使用 analysis-smartcn 插件实现中文分词

Elasticsearch 默认的分词是英文的,这会导致中文会以字为单位分组,而不是以词语来分组。

若要实现中文的分词,则需要借助中文的分析器插件。这里使用的是 analysis-smartcn 插件。

安装 analysis-smartcn 插件:

bin\elasticsearch-plugin install analysis-smartcn
Elasticsearch 相关度评分

Elasticsearch 查询时会有一个默认的排序,这个默认排序的依据就是 相关度评分(_score

相关度评分背后的理论

.NET Core Elasticsearch.Net and NEST

1. 安装包

Install-Package NEST
Install-Package Elasticsearch.Net
Windows 下安装 Elasticsearch 2.0.0

1. 下载 elasticsearch-2.0.0

下载 elasticsearch-2.0.0.zip

2. 解压并安装

解压后运行 bin 目录下的 elasticsearch.bat

Elasticsearch MapperParsingException

使用 Java API 添加第一条索引记录时,如果 Elasticsearch 中还没有该索引则会自动创建该索引。

今天遇到一个奇怪的情况,有一条数据,通过该数据创建索引时有异常,通过别的数据则没有该错误。

最奇怪的是一旦通过正常的数据创建成功后,之前错误的数据也能正常插入了。

MapperParsingException[failed to parse]; nested: IllegalArgumentException[mapper [priceDetails.amountSettlement] of different type, current_type [double], merged_type [long]];