【问题标题】:How to search for different spellings of a persons full name如何搜索一个人全名的不同拼写
【发布时间】:2013-09-13 10:56:54
【问题描述】:

我想在 Solr 数据库中搜索全名。数据库中的文档来自不同的来源,因此文档中名称的拼写不一致。 拼写可以是 firstname lastname 或 lastname firstname。也可以有一个或多个名字和一个或多个姓氏。

所以如果一个名字是: 姓名:阿尔贝托·豪尔赫 姓氏:ALONSO CALEFACCION

拼写可以是: 阿尔贝托·豪尔赫·阿隆索·卡利法西翁

阿尔贝托·J·阿隆索·卡利法西翁

阿尔贝托·J·阿隆索·卡利法西翁

阿尔贝托·阿隆索·卡利法西翁

和 阿隆索·卡利法西翁·阿尔贝托·豪尔赫

ALONSO CALEFACCION ALBERTO J.

阿隆索·卡利法西翁·阿尔贝托·J

阿隆索·卡利法西翁·阿尔贝托

我只能用“ALONSO CALEFACCION”~0 搜索姓氏并得到正确的回答。

但是如何在一场比赛中搜索所有不同的拼写? 搜索将由程序根据用户输入创建。

搜索更加复杂,因为西班牙名字可以包含额外的词,如“y”和“de”,而这些词是必需的(在我们的例子中)。 因此数据库中的名称可能类似于:ALBERTO JORGE ALONSO Y CALEFACCION

感谢您的帮助。

我使用 Solr 3.6

【问题讨论】:

标签: search solr


【解决方案1】:

如果您将名字保存在 firstname 中,将姓氏保存在 lastname 字段中,您可以使用某种编程语言准备查询。比如用户输入了2个字,可以查询firstname:(word1) AND lastname:(word2) OR firstname:(word2) AND lastname:(word1)

您甚至可以为这些字段创建一个特殊类型以查找初始形式和收缩形式:

<fieldType name="AuthorsPrefix" class="solr.TextField"  positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory" />
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="200" side="front"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory" />
  </analyzer>
</fieldType>

您可以阅读更多here

另一种方法是在索引期间生成所有可能的组合并在此组合字段中搜索作者:

ALBERTO JORGE ALONSO CALEFACCION
ALBERTO J ALONSO CALEFACCION
ALBERTO ALONSO CALEFACCION
ALONSO CALEFACCION ALBERTO JORGE
ALONSO CALEFACCION ALBERTO J
ALONSO CALEFACCION ALBERTO

您可以自动生成同义词,创建自己的SearchComponent

【讨论】:

  • 感谢 Max 和 Artem 提供的链接。这些并没有提供完整的解决方案(可以有 100% 的解决方案吗?)但足以使用。我的结论:我可以从 Solr 获得 75% 好的结果,并且必须处理结果以使用 PHP 中的正则表达式获得更好的结果,如:link:
  • 100% 的方法是在索引中列出所有可能的名称
猜你喜欢
  • 2013-09-17
  • 2020-05-07
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多