我正在使用带有Java的elasticsearch,我需要通过只键入3个字符来查找用户名或姓。 我做了正常的搜索,当我输入完整的名字或姓氏时,我会得到答案。 有人告诉我,我应该使用Ngram,但我正在尝试,现在我找不到任何东西。
我的代码:
TransportClient client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
XContentBuilder settingsBuilder = XContentFactory.jsonBuilder()
.startObject()
.startObject("analysis")
.startObject("analyzer")
.startObject("ngram_analyzer")
.field("tokenizer", "ngram_tokenizer")
.endObject()
.endObject()
.startObject("tokenizer")
.startObject("ngram_tokenizer")
.field("type","nGram")
.field("min_gram","3")
.field("max_gram","8")
.endObject()
.endObject()
.endObject()
.endObject();
String json = settingsBuilder.string();
client.admin().indices()
.prepareCreate("user").setSettings(settingsBuilder).get();
QueryBuilder qb = multiMatchQuery(
search,
"firstname","lastname"
);
SearchResponse response = client.prepareSearch("user")
.setQuery(qb)
.execute()
.get();
System.out.println(response.getHits().getTotalHits()); // 0
我试图使用此解决方案:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html;
System.out.println(json)给了我:
{
"analysis": {
"analyzer": {
"ngram_analyzer": {
"tokenizer": "ngram_tokenizer"
}
},
"tokenizer": {
"ngram_tokenizer": {
"type": "nGram",
"min_gram": "3",
"max_gram": "8"
}
}
}
}
所以它应该是正确的,但正如我所说,0次点击。 我试图将设置复制到json文件并加载它,效果是一样的。
我花了一整天的时间,我将非常感谢你的帮助。