我对Java elasticsearch(2.3.3)
有一个小问题TransportClient client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
QueryBuilder qb = multiMatchQuery(
"org", // George
"firstname","lastname"
).fuzziness(Fuzziness.build(2));
SearchResponse response = client.prepareSearch("user")
.setQuery(qb)
.execute()
.get();
for(SearchHit hit : response.getHits()){
System.out.println(hit.getSource());
}
通过模糊,当我没有输入2个字母时,我可以找到。
我希望它通过名字或姓氏,3个或更多字母来查找用户。 过去几个小时我一直在寻找一种方法。
在这种情况下,我需要找到" George Michel"通过键入" org",但没有运气。但有人可以输入" Gegorge Jackson"然后我应该找到" Geroge Michel"和迈克尔杰克逊"。
感谢您的帮助。
答案 0 :(得分:3)
您可以在elasticsearch中使用NGram tokenizer。 NGram tokenizer有什么作用? 假设你有一个字符串“day”,所以它会将字符串拆分为 “d”,“a”,“y”,“da”,“ay”,“day”有助于搜索查询。 这确实有限制。最大和最小长度
更多信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html
答案 1 :(得分:1)
要搜索,如下面的代码可以使用。
例如:列名是地址 出现的价值观:
搜索字符串:" spring"
QueryBuilders.boolQuery().should(QueryBuilders.queryStringQuery("*"+spring+"*").lenient(true).field("Address"))
以上两个结果都将返回,而在Code下面只返回一个(即2)结果。
QueryBuilders.boolQuery().should(QueryBuilders.queryStringQuery("spring").lenient(true).field("Address"))
注意在第一个查询构建器中我使用了' *'。
答案 2 :(得分:0)
我正在寻找并找到类似这样的东西:
XContentBuilder settingsBuilder = XContentFactory.jsonBuilder()
.startObject()
.startObject("analysis")
.startObject("tokenizer")
.startObject("my_ngram_tokenizer")
.field("type","nGram")
.field("min_gram",1)
.field("max_gram",1)
.endObject()
.endObject()
.startObject("analyzer")
.startObject("ShingleAnalyzer")
.field("tokenizer","my_ngram_tokenizer")
.array("filter","standard","lowercase")
.endObject()
.endObject()
.endObject()
.endObject();
this.client.admin().indices()
.prepareCreate("user").setSettings(settingsBuilder).get();
但没有改变,我做错了什么?哎哟。
编辑: 它仅适用于“geo”,但不能没有.fuzziness(Fuzziness.build(2));
QueryBuilder qb = multiMatchQuery(
search,
"firstname","lastname"
).analyzer("ShingleAnalyzer");