2010-11-18 66 views
1

如果我试图检索[email protected],搜索“dave”将会像“[email protected]”一样工作。查询由lucene索引的电子邮件地址

但搜索“dave @ gmail”不起作用。查询发生在Java servlet中。 我认为这个问题可能在于分割完全停止

我该如何解决这个问题,以便“dave @ gmail”将返回“[email protected]”?电子邮件地址,也可以包含其他领域(如.co.uk)

感谢

+0

当你说你有[email protected]索引时,它是如何到达那里的?我有一个类似的问题,我从一个文件中读取并添加到我的索引中。我没有意识到的是,我运行Apache tika从文件中获取文本。 apache tika的解析器将电子邮件ID分别标记为文本到达lucene分析器的时间,损坏已经完成。如果你正在使用这样的实现并且你找到了答案。让我知道。 – 2013-09-30 20:00:17

回答

3

Lucene的使用“仪”以tokenise和索引文档。同样,分析器用于标记用户搜索查询。

一个常见的错误是使用不同的分析器进行索引而不是搜索,两者都必须与您匹配以获得您期望的结果(搜索this doc“常见错误”)。

standard lucene tokeniser可识别电子邮件字符串并将它们编入索引。

它将索引[email protected]作为[token:[email protected]]。但是,您用来标记查询的分析器(或者如果您正在手动构建查询)可能会将其分解为3个标记,并以非字母数字字符分割。所以你可能会搜索3个相邻的令牌:[tok1:dave] [tok2:gmail] [tok3:com],它们不存在。

Query.toString可能会“漂亮地打印”您正在提交给Lucene的Query,它可能会帮助您进行调试。

+0

我为两者使用标准记号器。但是,如果整个电子邮件地址是单个令牌,那么这是否解释了为什么我没有得到我想要的结果?例如。如果我搜索“yah”,我希望“yahoo”能够包含在搜索结果中吗? – chazmuzz 2010-11-18 14:10:37

+0

这取决于,在索引过程中可能使用一系列分析器,有些人可能会将电子邮件索引为3个令牌(dave,gmail,com),另一个可能会将整个索引编入索引([email protected])。这可以解释为什么你会受到戴夫的打击。你可以使用Luke检查你的索引的内容 - 看看你是否可以看到令牌'[email protected]'为单个实体。在您的查询中也尝试使用toString,以确保您提交“[email protected]m” – Joel 2010-11-18 15:09:11

0

使用

org.apache.lucene.analysis.standard.UAX29URLEmailTokenizer 

org.apache.lucene.analysis.KeywordTokenizer 

标记生成器,以能够通过电子邮件

0

你可以使用模糊在查询搜索一个分析器进行搜索。这将近似由用户定义levenshtein距离(LD)设置的结果。

相关问题