Elasticsearch自动完成搜索中间词

时间:2018-12-14 04:36:24

标签: elasticsearch

我坚持了一段时间。

即使我写了一个中期词,我怎么能得到关于弹性搜索的建议来完成我的单词。 例如,在我的数据中,我有“ 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"}}}}'

}

1 个答案:

答案 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。它将生成很多令牌。

https://justpaste.it/4i6gh

您还可以使用_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提供的子字符串过滤器。