我刚刚冒险进入看似简单但极其复杂的搜索世界。对于一个应用程序,我需要构建一个搜索机制来通过用户的名字搜索用户。
在阅读了许多帖子和文章后,包括:
How can I use Lucene for personal name (first name, last name) search?
http://dublincore.org/documents/1998/02/03/name-representation/
what's the best way to search a social network by prioritizing a users relationships first?
http://www.gossamer-threads.com/lists/lucene/java-user/120417
Lucene Index and Query Design Question - Searching People
Lucene Fuzzy Search for customer names and partial address
...以及其他一些我目前找不到的。并且至少在我的机器上进行索引和基本搜索,我为用户搜索设计了以下方案:
1)有一个名字,第二个和第三个名字字段,并用 Solr 索引那些
2) 使用 edismax 作为 requestParser 进行多列搜索
3)使用归一化过滤器的组合,例如:音译,拉丁到ASCII转换等。
4)最后使用模糊搜索
显然,对此我很陌生,我不确定上述方法是否是最好的方法,并且希望听到有经验的用户在这个领域比我有更好的想法。
我需要能够通过以下方式匹配名称:
1) 重音折叠:Jorn 匹配 Jörn,反之亦然
2)替代拼写:卡尔匹配卡尔,反之亦然
3) 缩短的表示(我相信我使用 SynonymFilterFactory 这样做):Sue 匹配 Susanne 等。
4) Levenstein 匹配: Jonn 匹配 John 等。
5) Soundex 匹配:Elin 和 Ellen
非常欢迎任何指导、批评或评论。请让我知道这是否可能……或者我只是在做白日梦。 :)
编辑
我还必须补充一点,我还有一个全名字段,以防某些人的名字很长,例如其中一篇文章:Jon Paul 或 Del Carmen 也应该匹配 Jon Paul Del Carmen
由于这是一个新项目,我可以以任何我认为合适的方式修改架构和架构,因此限制非常有限。
最佳答案
听起来您正在为需要非常松散匹配的搜索来满足语料库的需求?
如果您这样做,您将需要选择您的字段并设置不同的提升来对您的结果进行排名。
所以在 solr 中有单独的“复制”字段:
See Also: more non-english Soundex discussion
名称的同义词,我不知道是否有可用的公共(public)同义词 db。
模糊搜索,我没有发现它有用,它使用 Levenshtein 距离。
其他过滤器和索引可以获得更出色的“搜索相关”结果。
名称中的 Unicode 字符可以用 ASCIIFoldingFilterFactory 处理。
您正在为预期的用例预先描述解决方案。
如果您想要高质量的结果,请计划调整您的 Search Relevance
当尝试匹配同义词时,这种调整将特别有值(value),例如 MacDonald 和 McDonald(其 Levenshtein 距离比 Carl 和 Karl 大)。
关于使用 Apache Solr 搜索名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5516503/