我有关于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 *”。
但是,在通过我的所有分析器过滤器后,有没有办法获得我的文本变量的值?如何获得分析仪的所有滤镜?这可能吗?
由于
答案 0 :(得分:1)
您可以使用QueryParser.setLowercaseExpandedTerms(true)吗?
**编辑**
好的,我现在明白你的问题。实际上,您希望在通过通配符查询之前阻止通配符。
您可以继承QueryParser并覆盖
protected Query getWildcardQuery(String field, String termStr) throws ParseException
在构造WildcardQuery之前通过分析器运行termStr。
但这可能不是用户期望的。根据常见问题,他们决定不通过分析仪运行通配术语是有原因的:
跳过分析仪的原因 如果你正在寻找 “狗*”你不会想要“狗” 从那以后,首先出现了“狗” 然后匹配“狗*”,这不是 预期的查询。