使用TRIE具有完成句子中间查询功能的自动完成功能?

时间:2019-04-16 21:24:13

标签: elasticsearch data-structures trie

建立一个新的自动完成系统,并且即使它们在句子中间,也要求使用关键词进行搜索。我有大量的书名清单,例如“史蒂夫·乔布斯自传”。用户可以选择键入“ Steve”,而不是输入“ Aut”作为查询前缀,并且仍应获得相同的结果。如何使用TRIE实现?我需要多个TRIE吗?在这方面的任何帮助都将非常有用。

1 个答案:

答案 0 :(得分:0)

一种执行此操作的方法是在input字段中添加多个completion。我曾经有一个与邮政地址类似的用例。例如,当用户开始输入以下任一令牌时,应显示“ 1000 Market St,San Francisco,CA 94103”这样的地址:

  • 1000
  • 市场
  • 市场街
  • (最终也是)旧金山(取决于大小)
  • (最终也是)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”时,这本书就会出现。您还可以使用权重,以便比其他变体形式更加重视准确的标题。

尝试一下,看看效果如何。