Java 用标准分析器清除Lucene搜索词

Java 用标准分析器清除Lucene搜索词,java,lucene,compass-lucene,Java,Lucene,Compass Lucene,我们正在用搜索词字符串构建bool查询来搜索Lucene索引。我希望使用标准分析器分析这些字符串,我们使用的分析器用于索引。例如,foo-bar 1-2-3应该分解为foo,bar,1-2-3,因为Lucene文档声明连字符会导致数字保持在一起,但单词会被标记化。最好的方法是什么 目前,我正在通过QueryParser运行搜索词字符串 QueryParser parser = new QueryParser("", new StandardAnalyzer()); Query query =

我们正在用搜索词字符串构建bool查询来搜索Lucene索引。我希望使用标准分析器分析这些字符串,我们使用的分析器用于索引。例如,
foo-bar 1-2-3
应该分解为
foo
bar
1-2-3
,因为Lucene文档声明连字符会导致数字保持在一起,但单词会被标记化。最好的方法是什么

目前,我正在通过QueryParser运行搜索词字符串

QueryParser parser = new QueryParser("", new StandardAnalyzer()); 
Query query = parser.parse(aSearchTermString);
问题是插入了引号。例如,
foobar 1-2-3
变成
“foobar”
1-2-3
,它不返回任何内容,因为Lucene将把
foobar
标记为
foo
bar


我绝对不想通过删除带有
replace
的引号来解决这种情况,因为我觉得我可能遗漏了一些东西或做了一些不正确的事情。

对于
StandardAnalyzer
,我实际上得到了不同的结果。考虑此代码(使用Lucene V4):

以上印刷品:

Using org.apache.lucene.analysis.standard.StandardAnalyzer
foo (0 3)
bar (4 7)
1 (8 9)
2 (10 11)
3 (12 13)

Using org.apache.lucene.analysis.standard.ClassicAnalyzer
foo (0 3)
bar (4 7)
1-2-3 (8 13)

someField:foo someField:bar someField:1 someField:2 someField:3     # of clauses:5
因此,上面的代码证明了
StandardAnalyzer
,与例如
ClassicalAnalyzer
不同,应该将
1-2-3
拆分为不同的标记-完全按照您的需要。对于查询,您需要转义每个关键字,包括空格,否则QP认为这有不同的含义


如果您不想转义查询字符串,您可以始终手动标记它(如上面的
printTokens
方法),然后用
TermQuery
包装每个标记,并将所有TermQuery堆叠到
布尔查询中

我实际上得到了
StandardAnalyzer
的不同结果。考虑此代码(使用Lucene V4):

以上印刷品:

Using org.apache.lucene.analysis.standard.StandardAnalyzer
foo (0 3)
bar (4 7)
1 (8 9)
2 (10 11)
3 (12 13)

Using org.apache.lucene.analysis.standard.ClassicAnalyzer
foo (0 3)
bar (4 7)
1-2-3 (8 13)

someField:foo someField:bar someField:1 someField:2 someField:3     # of clauses:5
因此,上面的代码证明了
StandardAnalyzer
,与例如
ClassicalAnalyzer
不同,应该将
1-2-3
拆分为不同的标记-完全按照您的需要。对于查询,您需要转义每个关键字,包括空格,否则QP认为这有不同的含义


如果您不想转义查询字符串,则始终可以手动将其标记化(如上面的
printTokens
方法),然后用
TermQuery
包装每个标记,并将所有TermQuery堆叠成
BooleanQuery

如果Apache文档声明StandardAnalyzer没有在连字符上拆分数字,为什么StandardAnalyzer要标记
1-2-3
?你能给我指出关于StandardAnalyzer的这句话吗?我发现StandardAnalyzer使用的是StandardTokenizer,而StandardTokenizer使用的是。FWIW,我没有深入研究后者。当然,.Ghm,如果我在Classicalyzer中使用连字符(‐),我会将数字文本拆分为标记,但如果我使用减号(-),它不会拆分。。。这更让人困惑!很可能是Javadoc已经过时了。想深入了解一下Unicode标准附录29吗?如果Apache文档声明StandardAnalyzer没有在连字符上拆分数字,为什么StandardAnalyzer会标记化
1-2-3
?你能给我指一下关于StandardAnalyzer的这句话吗?我发现StandardAnalyzer使用的是StandardTokenizer,而StandardTokenizer使用的是。FWIW,我没有深入研究后者。当然,.Ghm,如果我在Classicalyzer中使用连字符(‐),我会将数字文本拆分为标记,但如果我使用减号(-),它不会拆分。。。这更让人困惑!很可能是Javadoc已经过时了。想深入了解Unicode标准附录29吗?