我坚持了一段时间。
即使我写了一个中期词,我怎么能得到关于弹性搜索的建议来完成我的单词。 例如,在我的数据中,我有“ Alan Turing很棒”,然后开始输入“ turi”,我想看到建议字词“ Alan Turing很棒”。
我正在使用6.3.2版的弹性搜索,我尝试使用类似于以下内容的查询:
For Each ctrlTxt As TextBox In panelGroupDependent.Controls.OfType(Of TextBox)()
ctrlTxt.Dispose()
Next
For Each ctrlDtp As DateTimePicker In panelGroupDependent.Controls.OfType(Of DateTimePicker)()
ctrlDtp.Dispose()
Next
或
curl -X GET "http://127.0.0.1:9200/my_index/_search" -H 'Content-Type: application/json' -d '{"_source":false,"suggest":{"show-suggest":{"prefix":"turi","completion":{"field":"auto_suggest"}}}}'
但是它仅在我搜索“ alan”并且显示所有术语时有效。
索引:
curl -X GET "http://127.0.0.1:9200/my_index/_search" -H 'Content-Type: application/json' -d '{"_source":false,"suggest":{"show-suggest":{"text":"turi","completion":{"field":"auto_suggest"}}}}'
}
答案 0 :(得分:1)
我们有一个完全相似的用例,这就是我们解决的方式。您正在寻找的是substring
搜索。
请为您的字段创建一个custom substring
分析器,如下所示,其Java代码如下:-
TokenStream result = new WhitespaceTokenizer(SearchManager.LUCENE_VERSION_301, reader);
result = new LowerCaseFilter(SearchManager.LUCENE_VERSION_301, result);
result = new SubstringFilter(result, minSize);
return result;
在上面的代码中,我首先使用WhitespaceTokenizer
,然后将其传递给第一个LowerCaseFilter
,然后将其传递给我的自定义 SubstringFilter
代码,基于您想要的令牌中最少字符数。
如果您设置了最小子字符串长度3,则上面的代码将为hellowworld
之类的字符串生成以下令牌。
提供公共URI来访问它生成的令牌,例如helloworld
字符串和最小子字符串长度3。它将生成很多令牌。
您还可以使用_analyze
API https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html
http://localhost:9200/jaipur/_analyze?text=helloworld&analyzer=substring
在这里,斋浦尔是我的索引名称,helloworld
是我想使用substring
为其生成令牌的字符串。
编辑 正如Nishant在评论中所建议的那样,您可以使用ngram过滤器而不是Elastic inbuilt提供的子字符串过滤器。