记一下调查查询结果排序的结果,以供今后参考。
首先是参考这篇博客使用 FunctionScoreQuery
实现自定义分值的方案。
记一下调查查询结果排序的结果,以供今后参考。
首先是参考这篇博客使用 FunctionScoreQuery
实现自定义分值的方案。
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
中的 Page<T> search(SearchQuery searchQuery);
方法配合 NativeSearchQueryBuilder
来实现。
当查询结果超过 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.
通过 curl 工具可以测试 smartcn 分析器的分词效果(如何安装 smartcn 分析器请参考 这篇博客)。
由于 for Elasticsearch 5.x, 6.x, and 7.x: site plugins are not supported. (摘自 elasticsearch-head 的 GitHub 文档) ,所以没法像 2.0 版的安装方法 那样安装 Head 插件了。
Elasticsearch 默认的分词是英文的,这会导致中文会以字为单位分组,而不是以词语来分组。
若要实现中文的分词,则需要借助中文的分析器插件。这里使用的是 analysis-smartcn 插件。
安装 analysis-smartcn 插件:
bin\elasticsearch-plugin install analysis-smartcn
Elasticsearch 查询时会有一个默认的排序,这个默认排序的依据就是 相关度评分(_score
) 。
关于 Nested datatype
的官方介绍: https://www.elastic.co/guide/en/elasticsearch/reference/master/nested.html
简言之:将数组字段的 type
设置为 nested
,将会使数组中的每个元素作为单独的文档保存。查询时,数组中的每个元素作为一个整体来匹配查询条件。
Install-Package NEST
Install-Package Elasticsearch.Net
使用 Java API 添加第一条索引记录时,如果 Elasticsearch 中还没有该索引则会自动创建该索引。
今天遇到一个奇怪的情况,有一条数据,通过该数据创建索引时有异常,通过别的数据则没有该错误。
最奇怪的是一旦通过正常的数据创建成功后,之前错误的数据也能正常插入了。
MapperParsingException[failed to parse]; nested: IllegalArgumentException[mapper [priceDetails.amountSettlement] of different type, current_type [double], merged_type [long]];