我正在创建一个字典应用程序,用于搜索单词及其定义(两个单独的Field
)。但是,使用StandardAnalyzer
时,如果搜索字符串包含空格或特殊字符,则不会返回搜索结果。
例如,在我的虚拟字典数据中,搜索“lorem”会搜索其定义中包含“lorem”的所有单词,但搜索“lorem ipsum”不会返回任何内容,即使我的大多数虚拟单词都有lorem ipsum定义。
此外,搜索“make-believe”这样的单词只会在输入“make”时返回结果,但只要我包含短划线,就不会返回任何内容。
我想要包括空格,短划线,逗号等等字符 - 基本上是搜索字符串中的所有内容(除了可能是“and”,“at”,“by”等无意义的单词),但是什么样的分析器我应该用吗?我已尝试PatternAnalyzer
并提供.+
作为Pattern
进行查找,但即使只输入一个字母也不会返回任何内容。
答案 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)
我会认真考虑编写自己的分析仪,但我知道这比使用现有分析仪更难。