Search 从文章内容自动完成建议
我们的目标Search 从文章内容自动完成建议,search,elasticsearch,autocomplete,Search,elasticsearch,Autocomplete,我们的目标 我们想让我们的用户能够在开始键入时获得搜索建议,但ElasticSearch suggesters没有提供任何适合我们从文章中获取文本片段建议的功能。对于标题变化很大的索引,对文档标题进行规划和搜索是很好的,但对于少量的文章,标题并不代表足够的信息,许多搜索短语返回零结果。我们也不能让用户在所有文件上都贴上相关建议线索的标签 我们的文档通常由标题和描述(正文)以及各种其他属性(如组、类别和部门)组成 我们当前的解决方案:单独索引中的木瓦 每次为文档编制索引时,我们都会调用elast
我们想让我们的用户能够在开始键入时获得搜索建议,但ElasticSearch suggesters没有提供任何适合我们从文章中获取文本片段建议的功能。对于标题变化很大的索引,对文档标题进行规划和搜索是很好的,但对于少量的文章,标题并不代表足够的信息,许多搜索短语返回零结果。我们也不能让用户在所有文件上都贴上相关建议线索的标签 我们的文档通常由标题和描述(正文)以及各种其他属性(如组、类别和部门)组成 我们当前的解决方案:单独索引中的木瓦
每次为文档编制索引时,我们都会调用elasticsearch(分析端点)来生成文档描述+标题的木瓦(2-5)。然后,每个结果(带状疱疹产生大量结果)作为名为Suggestion的字段存储在新索引中的原始文档副本中。这是因为有些用户可能希望对属于某个类别的文档或我们提供选项的任何其他任意筛选提供缩小范围的建议 原始文档(主索引):
{
"Title": "A fabulous document",
"Description": "A document with fabulous content"
"Category": "A"
}
(Suggestion 1)
{
"Title": "A fabulous document",
"Description": "A document with fabulous content",
"Category": "A"
"Suggestion": "A"
}
(Suggestion 2)
{
"Title": "A fabulous document",
"Description": "A document with fabulous content",
"Category": "A"
"Suggestion": "A document"
}
...
(Suggestion N)
{
"Title": "A fabulous document",
"Description": "A document with fabulous content",
"Category": "A"
"Suggestion": "a document with"
}
建议文件(建议索引){
"Title": "A fabulous document",
"Description": "A document with fabulous content"
"Category": "A"
}
(Suggestion 1)
{
"Title": "A fabulous document",
"Description": "A document with fabulous content",
"Category": "A"
"Suggestion": "A"
}
(Suggestion 2)
{
"Title": "A fabulous document",
"Description": "A document with fabulous content",
"Category": "A"
"Suggestion": "A document"
}
...
(Suggestion N)
{
"Title": "A fabulous document",
"Description": "A document with fabulous content",
"Category": "A"
"Suggestion": "a document with"
}
但是正如你所看到的,一篇1000字的文章,我们很容易得到成百上千的木瓦,每个木瓦都复制了整个主要文档
要搜索,我们在建议文档中进行前缀搜索,并进行术语聚合,以获得出现频率最高的单词组合,我们的用户实际上有点喜欢这种解决方案,只要他们没有更好的
另一个更简单但速度太慢的解决方案
我们已经尝试过用一个shingles分析器分析一个copy_to字段(autocomplete),然后用一个regex include过滤器进行术语聚合,以删除不以搜索短语开头的术语,但是这太慢了,而且内存太大,与(特定查询的)不相关术语的数量一样因为每个领域都太伟大了 搜索:“fabulo” 基于以前搜索的建议
我们正在根据以前的搜索短语提出建议,但是如果新用户很少有用户生成的搜索,那么他们也需要一些基于内容的自动完成建议 问题:
有什么方法可以更快、更简单、更好地实现这一点吗?
ElasticSearch似乎都要求您提前知道建议或具有描述性标题。似乎非常适合产品建议,但不适合大文本内容的建议。此外,我们还需要考虑过滤问题。我们将木瓦和聚合组合使用到一个专用索引中:
“类型”:“木瓦”,
“最大瓦片尺寸”:3,
“min_shigle_尺寸”:1
},
你看过edge nGrams吗?您可以在边缘nGrams字段上使用搜索查询,而不是使用建议API。它不会像建议那样快,但是你可以获得相当好的响应时间,依我看。我已经在使用EdgeGrams对标题进行自动完成建议了。但是对于许多用户来说,仅仅是没有足够的标题来提供任何好的建议,需要使用正文内容(数千字)。你看到edgeNgrams能帮上忙吗?我该如何从中提取建议短语呢?如果你想在每次击键时提出建议,我也会在描述字段中使用edgeN gram。片段可以使用合适的高亮笔生成,也许是帖子(返回完整的句子)@ArchitSaxena,这实际上是一个很棒的想法。如果这样做有效的话,你应该得到一个奖励,因为它可以让我摆脱10亿个文档(不是开玩笑)!我马上就去试试:-)太好了那么奖品是什么哈哈?谢谢你的建议。你能详细说明一下“弹性现在支持类别字段以缩小建议索引”吗?我不知道你到底指的是哪一个功能。啊,它被称为“上下文”,而不是类别。您可以向每个建议记录添加许多这样的上下文,以添加额外的筛选。请注意,elastic 7中的上下文数量有限。见: