0

我需要为我的应用程序创建简单的搜索引擎。让我们将其简化为以下内容:我们有一些文本(很多),我需要搜索并显示相关结果。

我基于这篇很棒的文章扩展了一些东西,它对我来说效果很好。

但我在词干方面有问题。例如,“annotation”、“annotations”等词将被提取为“annot”,但假设您尝试搜索某些内容,您会看到意想不到的结果:

  • “anno” - 什么都没有
  • “annota” - 什么都没有。

只有单词“annot”会给出相关的结果。那么,我应该如何改进我的搜索以提供预期的结果?因为“annot”包含“anno”,而“annota”比“annot”略多。一直使用 contains 显然不是解决方案

如果在第一种情况下我可以使用一些三元搜索树,在第二种情况下我不知道该怎么做。

任何想法都会非常有帮助。

更新

oleksii在这里向我指出了 n-gram ,这可能对我有用,但我不知道如何正确索引 n-gram。

所以问题

  • 哪种数据结构最适合我的需求
  • 如何正确索引我的 n-gram
4

1 回答 1

1

词干在这里可能并没有太大的意义。词干会将复数形式转换为单数形式。

假设你有一个分词器、一个词干分析器和一个清理器(删除停用词,可能是标点符号和数字,短词等),你正在查看的是一个全文搜索。我建议您使用现成的解决方案(如 Elasticsearch、Lucene、Solr),但如果您喜欢 DIY 方法,我可以建议以下简单的实现。

步骤 1
创建一个面向搜索的分词器。一个例子是n-gram分词器。它将接受您的话并分成以下序列:

注解
1 - [a, n, o, t, a, i]
2 - [an, nn, no, ot, ...]
3 - [ann, nno, not, ota, ...]
4 - [anno, nnot, nota, otat, ...]
……

步骤 2
对 n-gram 进行排序以提高查找效率

步骤 3
使用二分搜索在 n-gram 中搜索精确匹配

于 2015-04-07T13:04:12.000 回答