Lucene在寻找汉堡时带上芝士汉堡

时间:2012-04-24 15:46:00

标签: lucene

我希望如果lucene文档包含 cheeseburger 这个词,并且用户会搜索汉堡以显示这些文档。我看到我可能需要一个自定义分析器来将这个复合词分解为 cheese burger 。但是,打破单词也可能带来无关的结果。

例如:如果在索引制作时我们也将产品离子编入索引,那么当用户搜索包含离子文档时生产将会出来,这是不相关的。

所以一个简单的断字器不会削减它。我需要一种方法知道芝士汉堡汉堡奶酪相关联,但生产生产无关的离子即可。

是否有更智能的流程来实现这一目标?

这是否有一个名称,就像词干是将单词缩减为根形式?

5 个答案:

答案 0 :(得分:1)

你应该看DictionaryCompoundWordTokenFilter使用强力算法根据字典分割复合名词。

答案 1 :(得分:1)

根据您对同义词的准确程度,您可能需要研究Latent Semantic Analysis(LSA)及其变体(如LDA等)等方法。更简单的方法是使用Ontology,如Wordnet以增加您的搜索量。 Wordnet Lucene索引可用。但是,如果您的方案包含特定于域的词汇,那么您可能需要生成“映射”本体。

答案 2 :(得分:0)

在大多数情况下,您只需使用带有通配符*汉堡的通配符查询即可。您只需在查询解析器上启用对前导通配符的支持:

parser = new QueryParser(LuceneVersion.getVersion(), searchedAttributes, analyzer);
parser.setAllowLeadingWildcard(true);

保重: 领先的通配符可能会减慢搜索速度。

如果您需要更具体的解决方案,我建议您采用词干。如果真的找到合适的分析仪。 有几种语言的词干实现,例如SnowballAnalyzer(http://lucene.apache.org/core/3_6_0/api/all/org/apache/lucene/analysis/snowball/SnowballAnalyzer.html)。

致以最诚挚的问候,

克里斯

答案 3 :(得分:0)

通过查看单词获得关联不会扩展到其他单词。例如,你不能知道“whopper”与汉堡有关,而“big-mac”只是通过查看单词与奶酪相关联。要使搜索知道关联,您可能需要一个关联数据库,如“A是B”或“A包含B”。 (正如Mikos所提到的,我认为WordNet提供了这样一个数据库。)然后,当你在查询中看到B时,你翻译查询以便它也搜索A。

答案 4 :(得分:0)

我认为根本问题是 - 您正在编制索引的集合有多大?如果您正在索引某些已知所有同义词和相关单词的集合,则索引可以直接包含同义词和相关单词,例如'cheeseburger',包括相关单词'cheese'和'burger'。 (一种成功用于LOINC标准医学术语Lucene指数的方法。)

如果你试图解决整个人类语言(英语,中文等)的一般问题,那么你必须转向上面提到的某种语义分析。

与您正在编制索引的区域的主题专家交谈可能有用,看看他们如何搜索术语 - 他们使用了哪些同义词/相关词,他们是否定义了同义词/相关词的列表,他们需要/使用词干等。这可以让你了解你需要采用哪种方法(直接同义词/相关词包含或语义分析)。