Edismaxの謎?
(The bot translated the original post https://lists.apache.org/thread/rhvpztwrb367x9oz8hh4w2q4hdpxsz3y into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)
皆さん、こんにちは。
勇気を持っており、edismaxパーサーの動作について少し知識がある方に、クエリ解析に関する簡単な質問があります!
これはおそらく例を挙げるのが最善だと思います:
以下に、2つのフィールドタイプで3つのフィールドがあります(以下に定義されています)
ST_Field1 - search_textフィールドタイプ
ST_Field2 - search_textフィールドタイプ
LC_Field1 - lowercaseフィールドタイプ
<!--英語のテキスト検索-->
<fieldType name="search_text" class="solr.TextField" positionIncrementGap="100" uninvertible="false">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1"/>
<filter class="solr.FlattenGraphFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<!--コード値検索 例:フライト番号QF123-->
<fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100" uninvertible="false">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.TrimFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
これらのフィールドを2用語クエリ「34567 something」でクエリした場合(フレーズクエリではなく、q.op=AND)、qfフィールドのみを変更すると、クエリパーサーの動作が大きく変わります。
クエリ1:qf=ST_Field1 ST_Field2を使用した場合
qfに「lowercase」フィールドタイプを使用しない場合 - 生成されるクエリは、各用語(合計2つ)ごとにMUST DisjunctionMaxQueryが存在し、各qfフィールドがSHOULD句となる - これが期待される動作です
"querystring":"34567 something",
"parsedquery":"+(+DisjunctionMaxQuery((ST_Field1:34567 | ST_Field1:34567)) +DisjunctionMaxQuery((ST_Field2:something | ST_Field2:something )))"
クエリ2:qf=ST_Field1 LC_Field1を使用した場合
「search_text」フィールドタイプのqfに「lowercase」フィールドタイプを使用すると - 生成されるクエリは、各qfフィールドが「search_text」フィールドタイプのMUST句となり、タイプ「lowercase」フィールドがSHOULD句となる -
"querystring":"34567 something",
"parsedquery":"+(+DisjunctionMaxQuery(((+ST_Field1:34567 +ST_Field1:something) | LC_Field1:34567 something )))"
これらのクエリの動作変更を規定するルールを高レベルで知っている方はいますか? もし知っている場合、そのような挙動変化を制限するために回避すべき特定の解析チェーンはありますか(つまり、クエリ1の動作を強制する、上記のクエリ2の動作ではない)。
Open Source Connectionsの方々(John Berryman)がedismaxに関する素晴らしい記事を持っています(https://opensourceconnections.com/blog/2013/03/07/the-anatomy-of-a-dismax-query/)、そしてそれが彼らかこのフォーラムのどこかで、クエリが「複雑すぎる」と挙動が変わると読んだことがありますが、その挙動変化を予測できるように、何がその挙動変化を引き起こすかのいくつかの具体的な点を理解することは有用です!
よろしくお願いします、
Dwane
Solr 8.8.2
トピックへ返信するには、ログインが必要です。