2010-07-29 69 views
2

Lucene NOOB警报!Lucene中的查询类型

我认为自己是一个至少具有合理智能的人,然而我在心理上对Lucene中的查询类型进行精神问题。

在我的特殊情况下,我需要搜索我的文档中只有一个单一的字符串字段长度(平均约50个字符)。

我希望用户能够在他们正在搜索的项目内键入单词的开头。而且我也不想强制他们提供条款的顺序。

实例字段:“一般的品牌实力”

应符合搜索: “通用品牌实力” “品牌普力” ...... “创麸STR” “糠通用海峡” 。 .. 等

我可能在单独的字段中存储我的信息(每个单词在这个例子中)如果有帮助,但我不相信它会。

我目前迷失在模糊通配符和多项短语的世界。

任何人都可以为我澄清这整个场景吗? (是的,我已经广泛地在网上寻找帮助,但找不到像样的资源)。

顺便说一句我正在使用Lucene 2.9,但我不认为这真的很重要。

回答

4

你不必存储在不同的领域内每学期。 Lucene会在每个术语之外创建令牌(如果您使用的是空白标记器),因此可以提供极大的搜索灵活性。

要将有关的问题:

实例字段: “一般的品牌 实力”

应该匹配的搜索: “通用品牌 实力”, “品牌普力”

的上述查询将返回两个结果,后者由于显而易见的原因而得分较低。然而,“gen bran str”,“bran generic str”......等是棘手的,因为它看起来这些术语不是标准的“梗”,在这种情况下你可以使用stemmer分析器。

最简单的方法是:

  1. 由空格分割的查询短语,让你有一个字符串[]
  2. 使用Booleanquery并为每个术语附加在通配符查询结束。

喜欢的东西:

string[] terms = query.split(" "); 
BooleanQuery bq = new BooleanQuery(); 

foreach(string term in terms) 
bq.Add(new Query("FieldName", term + "*",...); 

有更好的查询类型,如SpanQuery,DisMax等。,但是由于您提到了noob提醒,所以认为上述内容最简单(尽管不是最优雅的)方法。

HTH

+0

+1为通配符解决方案。最简单,尽管它可能会对大型索引产生性能问题。 – bajafresh4life 2010-07-29 16:28:22

+0

使用wilcard查询(通过添加星号)和PrefixQuery之间是否存在显着差异?他们看起来和我一样。思考?他们基本上归结为同一件事情吗? – berko 2010-07-30 03:37:53

+0

是的,它们是相同的。 Javadocs这样描述它: “查询匹配包含具有指定前缀的术语的文档.PrefixQuery由QueryParser构建,用于像app *一样的输入。” – Mikos 2010-07-30 11:20:22