最近在用开发?ES查询,遇到一个错误,错误信息如下:
ElasticsearchStatusException[Elasticsearch exception [type=parsing_exception, reason=[match] query does not support [auto_generate_synonyms_phrase_query]]]
at org.elasticsearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:177)
at org.elasticsearch.client.RestHighLevelClient.parseEntity(RestHighLevelClient.java:1406)
at org.elasticsearch.client.RestHighLevelClient.parseResponseException(RestHighLevelClient.java:1382)
at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1269)
at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1231)
at org.elasticsearch.client.RestHighLevelClient.search(RestHighLevelClient.java:730)
at com.yonghui.yh.soi.manage.productcenter.service.impl.ChannelStoreProductServiceImpl.selectProductByPageFromES(ChannelStoreProductServiceImpl.java:678)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
代码大致如下:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MatchQueryBuilder match = QueryBuilders.matchQuery("last_name", "Smith");
match.autoGenerateSynonymsPhraseQuery(false);
searchSourceBuilder.query(match);
随即百度了一下,得知是因为ES服务端和客户端版本差异的问题,
这是链接:https://blog.csdn.net/sinat_14913533/article/details/83107504
该文章的作者,采用换版本的方法,上下一致,解决问题。
但小弟我的项目pom.xml中,依赖的是一个公司内部封装的elasticsearch启动器starter,无法修改版本,如下图
换版本的方法解决不了我的问题,况且动pom.xml里的依赖,需要leader的批准,属于大动作。
经过几个小时的摸索,在吃饭的时候,不经意间灵感来了,就是自己可以写一个MatchQueryBuilder类,
比如叫:MatchQueryBuilderYongHui,代码直接从MatchQueryBuilder类里复制,
但删除掉三个跟auto_generate_synonyms_phrase_query有关的地方,如下图:
第41行注释后,会有两处报错,再注释掉报错的,然后使用这个自己定义的类,代码如下:
对比下使用ES的jar包给的MatchQueryBuilder 和 自己改编的MatchQueryBuilder 获得的查询条件json对比:
官方MatchQueryBuilder:
{
"match" : {
"productName" : {
"query" : "斧头西柚",
"operator" : "OR",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : false,
"boost" : 1.0
}
}
}
自定义MatchQueryBuilder:
{
"match": {
"productName": {
"boost": 1.0,
"fuzzy_transpositions": true,
"lenient": false,
"max_expansions": 50,
"operator": "OR",
"prefix_length": 0,
"query": "斧头西柚",
"zero_terms_query": "NONE"
}
}
}
完美去除auto_generate_synonyms_phrase_query,解决问题!!