使用 Apache Solr 搜索名称

标签 search solr lucene fuzzy-search edismax

我刚刚冒险进入看似简单但极其复杂的搜索世界。对于一个应用程序,我需要构建一个搜索机制来通过用户的名字搜索用户。

在阅读了许多帖子和文章后,包括:

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 中有单独的“复制”字段:

  • 精确全名的一个字段(带过滤器)
  • 带过滤器的多值字段 ASCIIFolding、小写...
  • SynonymFilterFactory ASCIIFolding, 小写...
  • 的多值字段
  • PhoneticFilterFactory(带有 CaverphoneDouble-Metaphone )

  • 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/

    相关文章:

    java - Elasticsearch 中的精确匹配

    arrays - 即使找到了,搜索数组也会报告 "not found"

    search - Yii2:全站搜索应该如何工作?

    hadoop - Nutch v Solr v Nutch+Solr

    java - Lucene 通配符匹配在化学符号上失败(?)

    php - 如何在elasticsearch中的功能增强查询中排序

    java - 在 Solr 3.3.0 中搜索图像

    python - 在 pyspark 数据帧的其余列中搜索 column1 中的值

    java - solr autoSoftCommit 将打开新的搜索器?

    php - 如何在 ubuntu 中将 SOLR 从正常的 8983 端口移动到 Apache Tomcat 7 服务器?