【发布时间】:2016-10-12 09:43:51
【问题描述】:
假设我有一个包含用户集合的索引,将他们的全名存储在名称字段中。其中一些用户的格式是“Firstname Lastname”,有些是“Firstname Middlename(s) Lastname”
例如
- 乔博客
- Joe Fred 博客
- Joe John Paul 博客
如果我搜索“Joe Bloggs”,我需要它来返回上面列出的所有用户。
我尝试过使用 PhraseQuery ,但这只会返回“Joe Bloggs”(我推测是因为术语需要按正确的顺序排列)。
我唯一的选择是使用 WildcardQuery 吗?我不希望返回“Joe Smith”或“John Bloggs”。此外,我无法修改索引以将全名拆分为单独的字段。
我应该如何最好地形成我的查询以使事情按要求工作?
谢谢
【问题讨论】:
-
搜索
Joe *Bloggs为什么会返回“Joe Smith”? -
@JeroenMostert 我更多地考虑 Joe* Bloggs 的思路。无论哪种方式,我都不确定 Joe *Bloggs 是否会起作用。假设您正在搜索“Joe *Bloggs”并且有人被称为“Joe Bigbloggs”,我们不希望他出现在结果中。
-
这就是我选择
Joe *Bloggs的原因,因为Joe* Bloggs也会找到Joey Bloggs,而且我认为姓氏带有意外前缀的可能性小于名字带有意外的后缀,如果可以将 Lucene 配置为以区分大小写的方式进行搜索(我不知道是否可以),您只会担心出现Joe McBloggs,而不是Joe Bigbloggs。但是你是对的,如果空格很重要,没有通配符查询可以在这里完全正常工作。 (您总是可以对“大部分正确”的结果进行一些后过滤。) -
或者,您可以使用
BooleanQuery,其中OR将通配符查询Joe Bloggs和Joe * Bloggs一起使用。不知道效率,但它应该只找到你所追求的。
标签: c# lucene.net querying