elasticsearch resthighlevelclient搜索,通配符不起作用

bq9c1y66  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(2)|浏览(654)

我尝试在java应用程序中使用通配符“*”,使用elasticsearch的resthighlevelclient api进行搜索。但没有找到匹配的。
索引数据:

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
}

打印searchreq:

{"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"}}]}

索引Map:

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

我怀疑是因为type=keyword而不是text。但是,为什么使用url进行搜索效果很好呢?
感谢任何指点!我是个初学者!
谢谢

kuarbcqp

kuarbcqp1#

好吧,我发现了问题。。
有一段代码用双引号将值 Package 起来。双引号本身可以很好地工作,但是如果有通配符,它就不工作了。
我有:

"query":"(firstName:(\"JEAN*\"))"

应该是:

"query":"(firstName:(JEAN*))"
i1icjdpr

i1icjdpr2#

“firstname”:{“type”:“keyword”}
在ElasticSearch中,不分析关键字字段,它们区分大小写。
a) 索引时间:“jean”将被索引为“jean”,而不是“jean”
b) 搜索时间:“jean”将查找“jean”,而不是“jean”或“jean”等
但是,es还支持关键字规范化。看看这个,玩一玩。
... "query“{”query\u string“{”query“:”(名字:(“jean*”))“…//0命中
0次命中,因为在存储之前未进行规范化和分析(区分大小写)。
... "query“:{”query\u string“:{”query“:”(名字:(“jean”))。//1次命中
因为和珍完全吻合,所以打了1中。
... "query“{”query\u string“{”query“:”(名字:(“jean*”))“…//0命中
它给我回了3支安打。

相关问题