Lucene NOOB 警报!
我认为自己是一个至少具有合理智力的人,但是我在头脑中摸索 Lucene 中的查询类型时遇到了巨大的问题。
在我的特定实例中,我需要在文档中搜索长度适中的单个字符串字段(平均大约 50 个字符)。
我希望用户能够在他们正在搜索的项目中键入单词的开头。而且我也不想规定他们提供条款的顺序。
示例字段:“通用品牌强度”
应匹配搜索: “通用品牌实力” “品牌通用强度” ... “根麸str” “麸皮通用str” ... 等等
如果有帮助的话,我可以将我的信息(示例中的每个单词)存储在单独的字段中,但我不相信会这样。
我目前迷失在模糊通配符和多术语短语的世界中。
有人能为我澄清整个情况吗? (是的,我在网上广泛寻求帮助,但找不到合适的资源)。
顺便说一句,我正在使用 Lucene 2.9,但我认为这并不重要。
最佳答案
您无需将每个术语存储在单独的字段中。 Lucene 从每个术语中创建标记(如果您使用空白标记生成器),因此允许搜索的极大灵活性。
关于您的问题:
Example field : "generic brand strength"
Should match searches : "generic brand strength" "brand generic strength"
上面的查询将返回两个结果,由于显而易见的原因,后者的分数较低。然而,“gen bran str”“bran generic str”...等很棘手,因为这些术语似乎不是标准的“词干”,在这种情况下您可以使用词干分析器。
最简单的方法是:
- 用空格分割查询短语,这样就有一个字符串[]
- 使用 bool 查询并为每个术语创建一个查询,并在末尾附加通配符。
类似于:
string[] terms = query.split(" ");
BooleanQuery bq = new BooleanQuery();
foreach(string term in terms)
bq.Add(new Query("FieldName", term + "*",...);
还有更好的查询类型,例如 SpanQuery、DisMax 等,但既然您提到了菜鸟警报,请认为上述是最简单的(尽管可能不是最优雅的)方法。
HTH
关于lucene.net - Lucene 中的查询类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3358749/