【问题标题】:Autocomplete using TRIE with ability to do middle of the sentence Query?使用 TRIE 自动完成句子查询的能力?
【发布时间】:2019-04-16 21:24:13
【问题描述】:

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

【问题讨论】:

    标签: elasticsearch data-structures trie


    【解决方案1】:

    一种方法是在您的completion 字段中添加多个input。我曾经有一个类似的邮政地址用例。例如,当用户开始输入以下任一标记时,应出现“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”时,这本书就会出现。您还可以使用权重,以便比其他变体更重视确切的标题。

    试一试,看看效果如何。

    【讨论】:

    • 问题是我有超过 3000 万本书的标题,我们不仅要进行全文搜索,还要显示类型化的类型建议,比如当用户键入击键时,书籍列表会显示在类型上前缀...因此想知道如何使用 TRIE 或类似的数据结构部署它(用于可扩展性和快速响应)
    • 您仍然可以在 display 字段上进行全文搜索,并在 suggest 字段上进行预先输入建议。您只需在索引时构建不同的输入。
    • 这个运气好吗?
    猜你喜欢
    • 2011-06-28
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多