エスケープされた括弧による構文エラー | KandaSearch Community Support Forum

エスケープされた括弧による構文エラー

トピック作成者:ks-solruserml-bot (2024/12/28 18:15 投稿)
5
OpenOpen

(The bot translated the original post https://lists.apache.org/thread/5pqg6zo6xxcbob5nczj99z4600fqjd4d into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)

こんにちは、

以下のクエリで潜在的に誤った字句エラーが発生しました:

  • 検索語に括弧が含まれている(エスケープと引用両方を試しました)
  • クエリパーサーが {} 内にある。実際のユースケースは !graph を使用していますが、簡単な !boost で再現可能です。
  • {!something ...} クエリの前に AND を使用しています。

このクエリは失敗します:

curl 'http://localhost:8983/solr/demo/select?q=inStock:true+AND+%7B%21boost+b%3Dmanufacturedate_dt%7Dname%3Athe%2520%5C%28concept%5C%29.xml'
{
"responseHeader":{
"status":400,
"QTime":1,
"params":{
"q":"inStock:true AND {!boost b=manufacturedate_dt}name:the%20\(concept\).xml"
}
},
"error":{
"metadata":["error-class","org.apache.solr.common.SolrException","root-error-class","org.apache.solr.parser.TokenMgrError"],
"msg":"org.apache.solr.search.SyntaxError: Cannot parse 'name:the%20\(concept\': Lexical error at line 1, column 22. Encountered: <EOF> (in lexical state 3)",
"code":400
}
}

引用した場合(エスケープは必要ないか?):

curl 'http://localhost:8983/solr/demo/select?q=inStock:true+AND+%7B%21boost+b%3Dmanufacturedate_dt%7Dname%3A%22the%2520%28concept%29.xml%22'
{
"responseHeader":{
"status":400,
"QTime":1,
"params":{
"q":"inStock:true AND {!boost b=manufacturedate_dt}name:"the%20(concept).xml""
}
},
"error":{
"metadata":["error-class","org.apache.solr.common.SolrException","root-error-class","org.apache.solr.parser.TokenMgrError"],
"msg":"org.apache.solr.search.SyntaxError: Cannot parse 'name:"the%20(concept': Lexical error at line 1, column 21. Encountered: <EOF> after prefix "\"the%20(concept" (in lexical state 3)",
"code":400
}
}

閉じ括弧を削除すると動作します:

curl 'http://localhost:8983/solr/demo/select?q=inStock:true+AND+%7B%21boost+b%3Dmanufacturedate_dt%7Dname%3Athe%2520%5C%28concept.xml'

前のステートメントを削除すると動作します:

curl 'http://localhost:8983/solr/demo/select?q=%7B%21boost+b%3Dmanufacturedate_dt%7Dname%3Athe%2520%5C%28concept%5C%29.xml'

この問題を見たことがある方はいらっしゃいますか? 8.3 および 9.6.1 でテストしました。

よろしくお願いします、
Thomas Å

返信投稿者:ks-solruserml-bot (2024/12/28 18:15 投稿)

こんにちは、Thomas

ローカルパラメータ参照を多く使用する方が、エスケープ処理と戦うより簡単だと思います。

例えば、以下のようにできます:

q=inStock:true AND {!boost b=manufacturedate_dt v=$nameq}&nameq={!field f=name}the (concept).xml

または、以下のように:

...{!field f=name v=$nameval}&nameval=the (concept).xml

フィールドの型によっては、{!term} を使用した方が良い場合もあります。

さらに、クエリが解析されているが挙動が不正な場合は、debugQuery=true を設定して出力を確認することをお勧めします。

--
よろしくお願いします、
Mikhail Khludnev

返信投稿者:ks-solruserml-bot (2024/12/28 18:16 投稿)

こんにちは、Thomas

正確な結果を再現することはできませんが、これはスペース文字が二重にエンコードされている(%2520)ことが原因かもしれません。もしこれを%20に置き換えてもまだ問題が発生する場合は、教えてください。

よろしくお願いします。

Patryk

返信投稿者:ks-solruserml-bot (2024/12/28 18:16 投稿)

こんにちは、

ローカルパラメータの提案ありがとうございます。残念ながら、UIによって個別の単位として処理されるfqステートメントにこれらのクエリが配置されているため、コードベースをリファクタリングしてローカルパラメータを利用することはできません。そのため、大規模なリファクタリングと複雑さの増加が必要となります。グラフトラバーサルは可能なfqステートメントの一つですが、Solrのデモデータセットで再現可能な{!boost ...}を使用しています。

Solrのデモデータセットを使用して再現していることを忘れていました。例えば、次のコマンドです:

docker run --name solr_demo -d -p 8983:8983 solr solr-demo

サンプルクエリを改良し、これがバグである可能性が高いことを明確に示すようにしました。以下を参照してください。debugQuery=trueはあまり役立ちません。なぜなら、失敗はプロセスの早い段階で発生しているからです。

失敗するクエリ:

curl 'http://localhost:8983/solr/demo/select?q=inStock:true+AND+%7B%21boost+b%3Dmanufacturedate_dt%7Dfeatures%3A%22%28hello%20with%20an%20accent%20over%20the%20e%29%22&rows=5&debugQuery=true'

成功するクエリ:

curl 'http://localhost:8983/solr/demo/select?q=%7B%21boost+b%3Dmanufacturedate_dt%7Dfeatures%3A%22%28hello%20with%20an%20accent%20over%20the%20e%29%22+AND+inStock:true&rows=5&debugQuery=false'

注:唯一の違いは、inStock:trueの部分をクエリの後ろに移動したことです。両者は同等であるべきです。

debugQueryを有効にできません。失敗すると次のエラーが表示されます:

"msg":"java.lang.IllegalAccessException: access violation: class org.apache.solr.schema.DatePointField$DatePointFieldSource, from public Lookup",

ありがとうございます。
Thomas Å

返信投稿者:ks-solruserml-bot (2024/12/28 18:16 投稿)

こんにちは、Thomas

どうやら、ローカルパラメータがクエリの途中にあるとき、パーサーは特殊文字に対してより敏感になるようです。おそらく、コンテキスト切り替えの必要が増えるためだと思われます。
ただし、括弧をエスケープすることで問題は解決しました:

curl 'http://localhost:8983/solr/demo/select?rows=5&q=inStock:true+AND+%7B%21boost+b%3Dmanufacturedate_dt%7Dfeatures%3A%5C%28hello%20with%20an%20accent%20over%20the%20e%5C%29'

前回の例:

curl 'http://localhost:8983/solr/demo/select?q=inStock:true+AND+%7B%21boost+b%3Dmanufacturedate_dt%7Dname%3Athe%20%5C%28concept%5C%29.xml'

よろしくお願いします。

返信投稿者:ks-solruserml-bot (2024/12/28 18:16 投稿)

こんにちは、Patryk

実験ありがとうございます。

はい、括弧の選択的エスケープで問題は解決しましたが、これは引用符で囲むのと同じではなく、括弧以外の特殊文字は必要ないようです。クエリやフィールド値を適切なエスケープ関数を使って送信すると(ユーザー入力であることが多い)、スペースもエスケープされます:

curl 'http://localhost:8983/solr/demo/select?rows=5&q=inStock:true+AND+%7B%21boost+b%3Dmanufacturedate_dt%7Dfeatures%3A%5C%28hello%5C%20with%5C%20an%5C%20accent%5C%20over%5C%20the%5C%20e%5C%29'

結果:

{
"responseHeader":{
"status":400,
"QTime":26,
"params":{
"q":"inStock:true AND {!boost b=manufacturedate_dt}features:\(hello\ with\ an\ accent\ over\ the\ e\)",
"rows":"5"
}
},
"error":{
"metadata":["error-class","org.apache.solr.common.SolrException","root-error-class","org.apache.solr.parser.TokenMgrError"],
"msg":"org.apache.solr.search.SyntaxError: Cannot parse 'features:\(hello\': Lexical error at line 1, column 18. Encountered: <EOF> (in lexical state 3)",
"code":400
}
}

また、inStock:true をクエリの最後に移動すれば動作します:

curl 'http://localhost:8983/solr/demo/select?rows=5&q=%7B%21boost+b%3Dmanufacturedate_dt%7Dfeatures%3A%5C%28hello%5C%20with%5C%20an%5C%20accent%5C%20over%5C%20the%5C%20e%5C%29+AND+inStock:true'

結果:

{
"responseHeader":{
"status":0,
"QTime":40,
"params":{
"q":"{!boost b=manufacturedate_dt}features:\(hello\ with\ an\ accent\ over\ the\ e\) AND inStock:true",
"rows":"5"
}
},
"response":{
"numFound":3,
"start":0,
"numFoundExact":true,
"docs":[...]
}
}

これはバグだと思いますので、Jiraで追跡するべきですが、回避策があるため、あまり時間をかけて調査する価値は少ないと思います(クエリで {!something ...} 部分を最初に配置することで回避可能です)。

このスレッドが問題に直面している他の人々にも役立つことを願っています。

Thomas Å

トピックへ返信するには、ログインが必要です。

KandaSearch

Copyright © 2006-2025 RONDHUIT Co, Ltd. All Rights Reserved.

投稿の削除

この投稿を削除します。よろしいですか?