想要使用完成建议程序构建电子商务网站的自动完成功能。
这是我的索引:
PUT myIndex { "mappings": { "_doc" : { "properties" : { "suggest" : { "type" : "completion" }, "title" : { "type": "keyword" }, "category" : { "type": "keyword" }, "description" : { "type": "keyword" } } } } }
现在,当上传广告时,我希望标题字段用于自动完成,因此这就是我上传文档的方式:
POST dummy/_doc { "title": "Blue asics running shoes", "category": "sports", "description": "Nice blue running shoes, size 44 eu", "suggest": { "input": "Blue Asics running shoes" // <-- use title } }
问题是,通过这种方式,elasticsearch仅从开始就匹配字符串…即“ Blu”将找到结果,但“ Asic”或“ Run”或“ Sho”将不返回任何内容…
所以我需要做的是像这样标记我的输入:
POST dummy/_doc { "title": "Blue asics running shoes", "category": "sports", "description": "Nice blue running shoes, size 44 eu", "suggest": { "input": ["Blue", "Asics", "running", "shoes"] // <-- tokenized title } }
这会很好…但是我应该如何标记我的字段?我知道我可以在c#中拆分字符串,但是无论如何,我可以在Elasticsearch / Nest中做到这一点吗?
完成提示器设计用于使用分析器(而不是数据类型默认的分析器)快速按需搜索 前缀 查询。simple``standard``text
simple``standard``text
如果您需要标题中 所有 标记上的部分前缀匹配,而不仅仅是标题的开头,那么您可能需要考虑采用以下方法之一:
input
completion
请记住,用于完成提示的数据结构在使用时会保存在内存中,因此文档中的高级基数会增加此数据结构的内存需求。还应考虑到匹配项的“计分”很简单,因为它是由应用于每个输入的权重控制的。
要么
title
text
keyword
花一些时间使用Analyze API来构建一个分析器,该分析器允许在标题中任何位置使用部分术语前缀。首先,诸如标准令牌生成器,小写令牌过滤器,Edgengram令牌过滤器以及可能的Stop令牌过滤器之类的工具将使您运行起来。还要注意,您希望搜索分析器执行与索引分析器类似的操作, 但 Edgengram令牌过滤器 除外 ,因为无需对搜索输入中的令牌进行ngramming。