【问题标题】:Lucene: How to do wildcard search inside a Term?Lucene:如何在 Term 中进行通配符搜索?
【发布时间】:2010-11-01 17:59:18
【问题描述】:

我有以下 lucene 索引:

Document A
item = level:(1)
item = level:(2)
item = level:(3)

Document B
item = level:(1)
item = level:(4)

假设我要搜索所有包含 level:(1) AND level:(2) 的文档?

Lucene 查询可能是这样的:

"item:level\:\(1\) AND level\:\(2\)"

但是否也可以这样做:

"item:level\:\(1 OR 2\)"

?

(这样做的原因是我不想重复字符串"level\:"

【问题讨论】:

  • 为什么不想重复“level:”?根据您的原因,可能还有其他解决方案。
  • 我猜想构建一个长文本字符串并将其发送到 Lucene 会降低性能?
  • 除非您包含数千个“级别:”字符串,否则我怀疑您会注意到任何可察觉的性能差异。我建议您尝试编写一些测试,看看添加更多“级别:”字符串时性能会降低多少。

标签: search lucene wildcard term


【解决方案1】:

最简单的解决方案是将level 设为您的查询解析器的默认字段,从而将您的查询简化为:

(1 OR 2)

但是,我怀疑这不是您正在寻找的...

根据Lucene query parser syntax documentation,您所要求的不能使用布尔运算符(ANDOR)来完成。但是,看起来可以使用加号 (+) 和减号 (-) 运算符。根据文档:

Lucene 支持使用括号将多个子句组合到一个字段中。

要搜索同时包含单词“return”和短语“pink panther”的标题,请使用以下查询:

title:(+return +"pink panther")

这不是您正在寻找的,但它可能是合适的。我不确定如何以这种方式编写 OR 子句。

【讨论】:

  • @Adam 我必须承认我的例子有点令人困惑。字段为“item”,内容为“level:(1)”。 (内容还包含“:”符号可能会令人困惑)我会尝试您的解决方案。它将类似于 "item:(+level \(1\) \(2\))" ?
猜你喜欢
  • 2011-08-10
  • 2018-04-20
  • 2014-06-07
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
相关资源
最近更新 更多