首页 > 解决方案 > 使用通配符的 ElasticSearch RestHighLevelClient 搜索不起作用

问题描述

我正在尝试使用 ElasticSearch 的 RestHighLevelClient API 在 Java 应用程序中使用通配符“*”进行搜索。但没有得到任何匹配。

指数数据:

JEAN
JEAN CHRISTOPHER
JEAN SOMETHING ELSE

使用 URL API 搜索:

http://mylocal-es-server.com/myindex/_search?q=firstName:JEAN*&pretty // 2 hits

JAVA代码(更新):

public SearchResponse preciseSearch(PreciseSearchRequest req) throws IOException {
    // convert my req to org.elasticsearch.action.search.SearchRequest:
    SearchRequest searchReq = createSearchRequest(req);
    // print searchReq (see below)
    return restHighLevelClient.search(searchReq, RequestOptions.DEFAULT); // returns 0 hit
}

打印搜索请求:

{"from":0,"size":1000,"query":{"query":"(firstName:(\"JEAN*\"))","fields:[],"type":"best_fields","default_operator":"or","max_determinzed_states":10000,"enable_position_increments":true,"fuzziness":"AUTO","fuzzy_prefix_length":0,"fuzzy_max_expansions":50,"phrase_slop":0,"escape":false,"auto_generate_synonyms_phrase_query":true,"fuzzy_transpositions":true,"boost":1.0}},"sort":[{"age":{"order":"desc"}}]}

索引映射:

"firstName" : { "type": "keyword" }

我怀疑这是由于 type = 关键字而不是文本。但是,为什么使用 URL 进行搜索可以正常工作呢?

任何指针表示赞赏!我是ES初学者!

谢谢

标签: elasticsearch

解决方案


“名字”:{“类型”:“关键字”}

在 Elastic Search 中,关键字字段不进行分析,并且区分大小写。

a)索引时间: 'JEAN' 将被索引为 'JEAN' 而不是 jean

b)搜索时间: 'JEAN' 将寻找 'JEAN' 而不是 'jean' 或 'Jean' 或 'jEAN' 等

但是,ES 也提供了对关键字规范化的支持。看到这个并玩弄它。

... "query":{"query_string":{"query":"(firstName:("jean*"))" ... // 0 命中

0 次命中,因为 JEAN 在存储之前未进行标准化和分析(区分大小写)。

... "query":{"query_string":{"query":"(firstName:("JEAN"))" ... // 1 次命中

由于与 JEAN 完全匹配,命中 1 次。

... "query":{"query_string":{"query":"(firstName:("JEAN*"))" ... // 0 次命中

它应该为我返回 3 次点击。


推荐阅读