0

単語とその定義(2つの別々Fieldのs)の両方を検索する辞書アプリを作成しています。ただし、を使用するStandardAnalyzerと、検索文字列に空白または特殊文字が含まれている場合、検索結果は返されません。

たとえば、私のダミー辞書データでは、「lorem」を検索すると、定義に「lorem」が含まれるすべての単語が検索されますが、「lorem ipsum」を検索しても、ほとんどのダミー単語の定義にloremipsumが含まれていても何も返されません。

また、「make-believe」のような単語を検索すると、「make」と入力した場合にのみ結果が返されますが、ダッシュを含めるとすぐに何も返されません。

空白、ダッシュ、コンマなどの文字を含めたいのですが、基本的には検索文字列のすべて(「and」、「at」、「by」などの意味のない単語を除く)ですが、どのアナライザーを使用すればよいですか。 ?私は探してみPatternAnalyzerて提供.+しましたが、1文字でも入力しても何も返されません。Pattern

4

2 に答える 2

0

StandardAnalyzer代替手段がないように思われるので、私はに固執しました。私が行ったことは、単語以外の文字をキャプチャする正規表現を介して文字列をトークン化し、それらをANDBooleanQueryで結合し、2つのクエリを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アプリではひどく遅いですが、後で最適化することができます。:)

于 2012-11-19T12:45:21.863 に答える
0

独自のアナライザーを作成することを真剣に考えますが、既存のアナライザーを使用するよりも難しいことはわかっています。

于 2012-11-20T22:25:00.763 に答える