elasticsearch - 使用通配符的 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初学者!
谢谢
解决方案
“名字”:{“类型”:“关键字”}
在 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 次点击。
推荐阅读
- python-3.x - ec2 实例无法连接到网站
- java - 在 MyBatis 中为每行结果集创建一个单独的对象
- c# - 应用程序不作为 EXE 运行
- azure - Azure 模板导出与部署的模板不匹配
- python - Flask SQL 没有这样的表
- regex - 需要将公式应用于某些空白单元格
- python - 尝试在 python3 中使用 NMAP 扫描一系列 IP
- kubernetes - 有没有办法 kubectl 应用目录中的所有文件?
- flutter - 一个 RenderFlex 在底部溢出了 41 个像素。相关的导致错误的小部件是 Column
- javascript - 用 jQuery 点击两个选项卡替换 UL 内容?