【发布时间】:2019-04-16 21:24:13
【问题描述】:
建立一个新的自动完成系统,并要求用关键词搜索,即使它们在句子的中间。我有大量的书名,例如“史蒂夫乔布斯自传”。用户可以选择键入“Steve”,而不是键入“Aut”作为查询前缀,但仍应得到相同的结果,如何使用 TRIE 实现?我需要多个 TRIE 吗?在这方面的任何帮助都会非常有帮助。
【问题讨论】:
标签: elasticsearch data-structures trie
建立一个新的自动完成系统,并要求用关键词搜索,即使它们在句子的中间。我有大量的书名,例如“史蒂夫乔布斯自传”。用户可以选择键入“Steve”,而不是键入“Aut”作为查询前缀,但仍应得到相同的结果,如何使用 TRIE 实现?我需要多个 TRIE 吗?在这方面的任何帮助都会非常有帮助。
【问题讨论】:
标签: elasticsearch data-structures trie
一种方法是在您的completion 字段中添加多个input。我曾经有一个类似的邮政地址用例。例如,当用户开始输入以下任一标记时,应出现“1000 Market St, San Francisco, CA 94103”之类的地址:
所以为了支持帽子用例,我们的想法是像这样索引一个文档:
PUT addresses/_doc/1
{
"display": "1000 Market St, San Francisco, CA 94103",
"suggest" : {
"input": [
"1000 Market St, San Francisco, CA 94103",
"Market St, San Francisco, CA 94103",
"San Francisco, CA 94103",
"94103"
]
}
}
地址的好处是它们有一个结构(街道编号、街道方向、街道名称等)。在您的情况下,对于书名,这有点困难,因为没有隐式结构。但是,您可以简单地在每个空格上拆分输入并索引空格之后的部分(不带停用词)。例如,对于“史蒂夫·乔布斯的自传”,您需要索引以下输入:
具体来说,
PUT books/_doc/1
{
"display": "Autobiography of Steve Jobs",
"suggest" : {
"input": [
"Autobiography of Steve Jobs",
"Steve Jobs",
"Jobs"
]
}
}
这样,当用户输入“Steve”甚至只是“Jobs”时,这本书就会出现。您还可以使用权重,以便比其他变体更重视确切的标题。
试一试,看看效果如何。
【讨论】:
display 字段上进行全文搜索,并在 suggest 字段上进行预先输入建议。您只需在索引时构建不同的输入。