次のプログラム:LuceneのQueryParser一貫性のない行動
\ -> __catch_all:foo __catch_all:bar
+ -> __catch_all:foo __catch_all:bar
- -> __catch_all:foo __catch_all:bar
! -> __catch_all:foo __catch_all:bar
(-> __catch_all:foo __catch_all:bar
) -> __catch_all:foo __catch_all:bar
: -> __catch_all:foo:bar
^ -> __catch_all:foo __catch_all:bar
[ -> __catch_all:foo __catch_all:bar
] -> __catch_all:foo __catch_all:bar
" -> __catch_all:foo __catch_all:bar
{ -> __catch_all:foo __catch_all:bar
} -> __catch_all:foo __catch_all:bar
~ -> __catch_all:foo __catch_all:bar
* -> __catch_all:foo __catch_all:bar
? -> __catch_all:foo __catch_all:bar
| -> __catch_all:foo __catch_all:bar
& -> __catch_all:foo __catch_all:bar
注意して見かけ上の矛盾を::
import java.util.Arrays;
import java.util.List;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.util.Version;
public class LuceneTest {
static final List<Character> SPECIAL_CHARS =
Arrays.asList('\\', '+', '-', '!', '(', ')', ':', '^', '[', ']', '"', '{', '}', '~', '*', '?', '|', '&');
public static void main(String[] args) throws ParseException {
QueryParser query =
new QueryParser(Version.LUCENE_31, "", new StandardAnalyzer(Version.LUCENE_31));
for (char c : SPECIAL_CHARS) {
System.out.println(c + " -> " + query.parse("__catch_all:foo\\" + c + "bar").toString());
}
}
}
は、この出力を与え、また、私は正確にやって特殊文字を(エスケープてることに注意してくださいQueryParser.escapeと同じです)。私は、StandardAnalyzerがクエリ用語から特別な句読点を取り除くことを期待しています。ほとんどすべてのケースでそうです。
これは特に矛盾すると思われる理由は、StandardAnalyzerとフィールドテキスト "foo:bar"を使って文書を書くとという2つのという用語フィールド、foo、barが得られるからです!
エスケープの2回目は正しい結果、つまり効果的に "foo \\:bar"を返します。しかし、なぜこれはコロンだけに必要ですか?なぜこの動作を避けるためにQueryParser.escape(QueryParser.escape(mystring))を行う必要がありますか?
。 * write *側では、StandardAnalyzerが文字列を "foo bar"としてトークン化しているように見えますが、これは矛盾しているようです。 – HenryR
あなたはどう思いますか?この問題を示すコードを提供できますか? – jpountz