如果我想允许字符串中的所有字符,我应该使用什么Lucene分析器?

时间:2012-11-19 12:17:26

标签: java string search lucene

我正在创建一个字典应用程序,用于搜索单词及其定义(两个单独的Field)。但是,使用StandardAnalyzer时,如果搜索字符串包含空格或特殊字符,则不会返回搜索结果。

例如,在我的虚拟字典数据中,搜索“lorem”会搜索其定义中包含“lorem”的所有单词,但搜索“lorem ipsum”不会返回任何内容,即使我的大多数虚拟单词都有lorem ipsum定义。

此外,搜索“make-believe”这样的单词只会在输入“make”时返回结果,但只要我包含短划线,就不会返回任何内容。

我想要包括空格,短划线,逗号等等字符 - 基本上是搜索字符串中的所有内容(除了可能是“and”,“at”,“by”等无意义的单词),但是什么样的分析器我应该用吗?我已尝试PatternAnalyzer并提供.+作为Pattern进行查找,但即使只输入一个字母也不会返回任何内容。

2 个答案:

答案 0 :(得分:0)

我坚持使用StandardAnalyzer,因为似乎没有替代品。我所做的是通过捕获非单词字符的正则表达式对字符串进行标记,将它们组合在AND BooleanQuery中,并将两个Field的查询组合在另一个OR BooleanQuery中。

在下面的代码中,entry是单词,description是定义,s是搜索字符串CharSequence

BooleanQuery bq = new BooleanQuery();
BooleanQuery entryBQ = new BooleanQuery();
BooleanQuery descriptionBQ = new BooleanQuery();
String[] tokens = String.valueOf(s).split("[^a-zA-Z0-9]");
for (String token : tokens) {
    if (token.isEmpty()) continue;
    entryBQ.add(new WildcardQuery(new Term("entry", token + "*")), BooleanClause.Occur.MUST);
    descriptionBQ.add(new WildcardQuery(new Term("description", token + "*")), BooleanClause.Occur.MUST);
}
bq.add(entryBQ, BooleanClause.Occur.SHOULD);
bq.add(descriptionBQ, BooleanClause.Occur.SHOULD);
TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);
is.search(bq, collector);

现在我的Android应用程序速度非常慢,但我可以稍后对其进行优化。 :)

答案 1 :(得分:0)

我会认真考虑编写自己的分析仪,但我知道这比使用现有分析仪更难。