【问题标题】:WildcardQuery not returning correct resultWildcardQuery 没有返回正确的结果
【发布时间】:2012-08-01 03:52:38
【问题描述】:

我已经使用一些数据创建了一个索引。现在我正在使用 WildcardQuery 来搜索这些数据。索引的文档有一个字段名称 Product Code 我正在搜索。

以下是我用于创建查询和搜索的代码:

Term productCodeTerm = new Term("Product Code", "*"+searchText+"*");

query = new WildcardQuery(productCodeTerm);

searcher.search(query, 100);

searchText 变量包含用于搜索索引的搜索字符串。如果searchString 是'jf',我会得到以下结果:

JF32358
JF5215
JF2592

现在,当我尝试使用 25, or f2 or f3 或仅使用 j,f,jf 以外的任何其他内容进行搜索时,查询没有命中。

我无法理解为什么会这样。有人可以帮我理解搜索出现这种情况的原因吗?

【问题讨论】:

  • 大小写不是这里的问题。数字部分总是相同的,它们不是大写或小写。
  • 但你说的是“f2”、“f3”,而不仅仅是“2”或“3”。
  • 我提到了25,它只包含数字。
  • 好的,抱歉,错过了。以为这只是案例的原因:(

标签: java search lucene wildcard


【解决方案1】:

您在编制索引时使用了什么分析器?鉴于您的示例,您应该确保您的分析器:

  • 小写,
  • 不删除数字,
  • 不在字母和数字的边界处分割。

【讨论】:

  • 我使用 StopAnalyzer 进行索引。它会小写,不会删除数字。虽然我不确定 3 点。但即使它会在字母和数字之间的边界处分裂,那么当我只使用数字(例如 32)进行搜索时,它应该可以工作。不应该吗?
  • 我发现了问题。是因为你提到的第三点。 StopAnalyzer 使用 LetterTokenizer 创建标记,这将在字母和数字之间的边界处破坏字符串。谢谢。
  • 但如果它这样做,它会不会完全不存储数字文字或将为数值创建单独的标记(例如 32358)或将为所有数值创建单独的标记(例如3,2,3,5,8)?
  • 对不起,我不明白这个问题。 “那样”是什么意思?如果我正确理解您在做什么,您可以使用由 LowercasingFilter 和 StopFilter 过滤的 WhitespaceTokenizer。
  • 这样我的意思是非字母分裂。
【解决方案2】:

在 lucene 常见问题页面中它说:

QueryParser 不支持前导通配符(例如 *ook) 默认。从 Lucene 2.1 开始,它们可以通过调用来启用 QueryParser.setAllowLeadingWildcard(true)。请注意,这可以是 昂贵的操作:它需要扫描令牌列表 完全索引以查找与模式匹配的那些。

更多信息请查看here.

【讨论】:

  • 我没有使用 QueryParser 来解析查询。其次,如果不支持前导通配符,那么当我使用字符串 f 进行搜索时,我不应该得到任何结果,但这里不是这种情况。只有当我只使用整数或字符 + 整数时,问题才会出现。
  • 抱歉,误解了您的问题。
  • 没关系。感谢您尝试提供帮助。 :)
猜你喜欢
  • 2023-03-14
  • 2014-09-13
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2017-11-24
相关资源
最近更新 更多