0

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

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

此外,搜索“make-believe”之类的词只会在键入“make”时返回结果,但只要我包含破折号,就不会返回任何内容。

我想包括空格、破折号、逗号等字符——基本上是搜索字符串中的所有内容(除了“and”、“at”、“by”等无意义的词之外),但是我应该使用什么分析器? 我已经尝试PatternAnalyzer并提供.+Pattern要查找的内容,但即使只输入一个字母也不会返回任何内容。

4

2 回答 2

0

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

于 2012-11-20T22:25:00.763 回答
0

我坚持使用 a ,StandardAnalyzer因为似乎没有其他选择。我所做的是通过捕获非单词字符的正则表达式对字符串进行标记,将它们组合在 ANDBooleanQuery中,并将两个Fields 的查询组合在另一个 ORBooleanQuery中。

在我下面的代码中,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 应用程序中现在非常慢,但我可以稍后对其进行优化。:)

于 2012-11-19T12:45:21.863 回答