如果我正在尝试检索dave@gmail.com,搜索“dave”将会像“dave@gmail.com”一样工作。
但是搜索“dave @ gmail”是行不通的。查询发生在Java servlet中。 我认为问题可能在于完全停止分裂
如何修复此问题,以便“dave @ gmail”返回“dave@gmail.com”?电子邮件地址也可能包含其他域名(例如.co.uk)
感谢
答案 0 :(得分:3)
Lucene使用“分析器”来标记和索引您的文档。同样,分析器用于标记用户搜索查询。
常见的错误是使用不同的分析器进行索引而不是搜索,两者必须匹配才能得到您期望的结果(搜索this doc以查找“常见错误”)。
standard lucene tokeniser识别电子邮件字符串并将其编入索引作为一个标记。
它会将dave@gmail.com编入[token:dave@gmail.com]。但是,您用来标记查询的分析器(或者如果您手动构建查询)可能会将其分解为3个标记,并将非字母数字字符拆分。所以你可能会搜索3个相邻的令牌:[tok1:dave] [tok2:gmail] [tok3:com],它们不存在。
Query.toString可能“打印”您提交给Lucene的查询,这可能有助于您调试。
答案 1 :(得分:1)
使用
org.apache.lucene.analysis.standard.UAX29URLEmailTokenizer
或
org.apache.lucene.analysis.KeywordTokenizer
tokenizer通过电子邮件地址搜索
答案 2 :(得分:1)
您可以在查询搜索中使用模糊作为分析器。这将近似用户定义levenshtein距离(LD)的结果集。
答案 3 :(得分:0)
accepted answer to using Lucene to search for email addresses显示了如何为电子邮件地址构建自己的标记器和分析器。创建自己的内容可以精确控制您在Lucene中存储和检索电子邮件地址的方式。