Lucene通配符查询

时间:2010-03-12 11:59:42

标签: java lucene wildcard

我有关于Lucene的这个问题。

我有一个表单,我从中获取了一个文本,我想在几个字段中执行全文搜索。假设我从输入中得到文本“textToLook”。

我有一个带有几个过滤器的Lucene分析仪。其中一个是lowerCaseFilter,所以当我创建索引时,单词会小写。

想象一下,我想搜索两个字段field1和field2,所以lucene查询将是这样的(请注意'textToLook'现在是'texttolook'):

field1: texttolook* field2:texttolook*

在我的班级中,我有类似的东西来创建查询。我没有通配符时工作。

String text = "textToLook";
String[] fields = {"field1", "field2"};
//analyser is the same as the one used for indexing
Analyzer analyzer = fullTextEntityManager.getSearchFactory().getAnalyzer("customAnalyzer");
MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, analyzer);
org.apache.lucene.search.Query queryTextoLibre = parser.parse(text);

使用此代码,查询将是:

field1: texttolook field2:texttolook

但如果我将文字设置为“textToLook *”,我会得到

field1: textToLook* field2:textToLook*

由于索引是小写的,因此无法正确找到。

我已经在lucene网站上看到了这个:

  

“通配符,前缀和模糊查询   没有通过分析仪,   这是执行的组件   诸如词干和   lowercasing“

我的问题无法通过设置行为不区分大小写来解决,因为我的分析器有其他字段,例如删除了一些单词的后缀。

我认为我可以通过获取我的分析器的过滤器后的文本来解决问题,然后我可以添加“*”然后我可以用MultiFieldQueryParser构建查询。所以在这个例子中我得到“textToLower”,在传递给这些过滤器后,我可以得到“texttolower”。在此之后,我可以制作“textotolower *”。

但是,在通过我的所有分析器过滤器后,有没有办法获得我的文本变量的值?如何获得分析仪的所有滤镜?这可能吗?

由于

1 个答案:

答案 0 :(得分:1)

您可以使用QueryParser.setLowercaseExpandedTerms(true)吗?

http://wiki.apache.org/lucene-java/LuceneFAQ#Are_Wildcard.2C_Prefix.2C_and_Fuzzy_queries_case_sensitive.3F

**编辑**

好的,我现在明白你的问题。实际上,您希望在通过通配符查询之前阻止通配符。

您可以继承QueryParser并覆盖

protected Query getWildcardQuery(String field, String termStr) throws ParseException

在构造WildcardQuery之前通过分析器运行termStr。

但这可能不是用户期望的。根据常见问题,他们决定不通过分析仪运行通配术语是有原因的:

  

跳过分析仪的原因   如果你正在寻找   “狗*”你不会想要“狗”   从那以后,首先出现了“狗”   然后匹配“狗*”,这不是   预期的查询。