2012-04-24 55 views
4

我希望如果一个lucene文档包含单词芝士汉堡和用户搜索汉堡这个文件来。我看到我可能需要一个自定义分析器来将此复合词分解成干酪汉堡。但是,闯词也可能带来不相关的结果。Lucene在搜索汉堡时带上芝士汉堡

例如:如果索引生产我们索引时产品离子为好,那么当包含生产离子文档的用户搜索会出来,这是不相关的。

所以一个简单的分词器不会削减它。我需要知道芝士汉堡关联到汉堡奶酪的一种方式,但生产没有关联到离子

有没有一个更聪明的过程来实现这一目标?

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

+2

+1因为我现在吃了芝士汉堡 – Soader03 2012-04-24 15:57:50

回答

1

根据您希望如何准确的同义词是,你可能需要考虑的方法,例如Latent Semantic Analysis(LSA)和它的变体,如LDA等更简单的方法是使用本体如Wordnet以增加你的搜索。一个wordnet Lucene索引是可用的。但是,如果您的场景包含特定于域的词汇表,那么您可能需要生成一个“映射”本体。

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)。

最好的问候,

克里斯

+0

谢谢。但是我想避免使用通配符解决方案,因为你说的很慢。我尝试了词干分析器,但它不起作用;对于这个特定的例子,它将单词减少为“cheeseburg”,因此当用户搜索“汉堡”时,它减少为“burg”,并且它仍然无法找到它。 – epignosisx 2012-04-24 16:14:07

+0

另一种解决方案是将您的内容复制到单独的字段并为该字段运行N-Gram分析器。它会将你的文字分成几部分。它可能会把它们分裂得很艰难......或者如你所说,它可能会分裂你不喜欢分裂的词语。你只需要尝试一下...... – csupnig 2012-04-25 07:00:44

1

你应该看看DictionaryCompoundWordTokenFilter它使用蛮力算法拆分基于字典复合名词。

+0

这不会将“生产”分解为“产品”和“离子”吗?我希望避免将言语打断成不相关的简单单词。 – epignosisx 2012-04-24 16:17:31

+0

这取决于你的字典里有什么。如果生产在您的字典中,并且过滤器被配置为偏好最长匹配(请参阅构造函数),则该单词不会被分割。 – jpountz 2012-04-24 16:45:32

+0

更准确地说,如果您的字典中包含“产品”,“离子”,“生产”,“奶酪”和“汉堡”,那么它的行为将与您预期的相同。 – jpountz 2012-04-25 14:55:57

0

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

0

我认为潜在的问题是 - 您索引的集合有多大?如果您正在索引某个集合,其中所有的同义词和相关词都已知,那么索引可以直接包含同义词和相关词,如“cheeseburger”,包括相关词“cheese”和“burger”。 (一种方法成功地在LOINC标准的医学术语Lucene索引使用。)

如果你正在试图解决的普遍问题为整个人类的语言(英语,中国等),那么你必须移动到某种语义分析如上所述。

与您正在索引的区域的主题专家交谈以了解他们如何搜索术语 - 他们使用的是什么同义词/相关词,他们是否定义了同义词/相关词的列表,他们是否需要/使用词干化等等。这应该给你一些关于你需要追求的方法(直接同义词/相关词包含或语义分析)的一些想法。