よしだのブログ

サブタイトルはありません。

【Solr】クエリのオペレータが無視される、仕様?!

こんにちは!今日は Solr の小ネタを書こうかと思います。この記事は Solr Advent Calendar 2016 の16日目の記事です!

qiita.com

qf に存在しないフィールドを含めると、q に指定したオペレータが検索キーワードとして扱われる。

今日ご紹介するのは、罠というかバグのような Solr の仕様です。対象の Solr のバージョンは 5.x 〜 trunk まで全てです。

Solr で edismax を使う際に、よく検索対象としたいフィールドを指定する際に qf パラメータを使うと思います。この、qf でキーワード検索したいフィールド名を羅列しておくと、q パラメータでフィールド名を指定せず、キーワードだけ指定することで qf で指定したフィールドを横断的に検索してくれます。

この qf に shema 定義に存在しないフィールド名を指定するとどうなるかというと、なんと q で指定した AND や OR などのオペレータが単なる文字列として検索されます。。

例)hogefoobar というフィールドは存在しないケース

q : 日本 OR タバコ defType : edismax qf : title hogefoobar

/select?q=日本 OR タバコ&defType=edismax&qf=title hogefoobar

上記のようなパラメータで検索すると、title フィールドに「日本」「OR」「タバコ」のいずれかのキーワードが含まれるドキュメントがヒットします。。

原因を調べてみたところ、以下の箇所で クエリのパース時に Exception を受け取ると、q の中身をエスケープして再検索するようになっています。qf に適当なフィールド名を指定すると、FieldNotFoundException が投げられ、この箇所でキャッチしエスケープして再検索しているため、OR は文字列として扱われます。。

https://github.com/apache/lucene-solr/blob/master/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParser.java#L310-L313

まとめ

というわけで、雑に qf に適当なフィールド名をつけて投げるとひどい目に合うよということで、きちんと qf には存在しているフィールドを指定しているか確認しましょう。 特に managed schema (スキーマレスモード) を使用していると、フィールドの管理が雑になりがちなので注意が必要だと思います。

一応

パッチを送っていたりしますが・・マージはされないかもしれません。

[SOLR-9677] edismax treat operator as a keyword when a query parameter 'qf' contains inexist field. - ASF JIRA