SolrのJSONファセット機能における関連性の奇妙な動作について

トピック作成者:ks-solruserml-bot (2024/06/22 19:12 投稿)
5
CloseClose

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

こんにちは、

関連性に基づいたファセットをqfフィールド(以下の例)で実行すると、ストップワードの除去が行われているにもかかわらず、JSONファセットにストップワードが表示されます。誰か理由を知っていて、これを回避する方法がありますか?

よろしくお願いします、
Dan

返信投稿者:ks-solruserml-bot (2024/06/22 19:12 投稿)

詳細

Solr 7.7.2

http://localhost:8983/solr/collection/select?

q=my query&
defType=edismax&
qf=description&
fore={!type=$defType qf=$qf v=$q}&
back=*:*&
rows=0&
json.facet={
  "description": {
    "type": "terms",
    "field": "description",
    "sort": { "relatedness": "desc"},
    "mincount": 2,
    "limit": 8,
    "facet": {
      "relatedness": {
        "type": "func",
        "func": "relatedness($fore,$back)"
      }
    }
  }
}
返信投稿者:ks-solruserml-bot (2024/06/22 19:12 投稿)

qfrelatednessは、あなたの質問とは無関係だと思います。あなたの質問が主に、どの用語が含まれるか(つまり、ランク付けはさておき、どの用語が含まれるか)についてであると理解しています。これを決定する唯一の要素は、termsファセットの"field"プロパティのフィールドとfieldTypeの設定、つまり"description"です。インデックス時の分析チェーン設定を含めて、その情報を共有してもらえますか?

返信投稿者:ks-solruserml-bot (2024/06/22 19:12 投稿)

こんにちは、Michael。

こちらにフィールドとfieldTypeの設定、および結果のスニペットを示します。

ストップワードリストを確認し、「a」や「be」のような単語が含まれていることを確認しました。また、UI分析を使用して、これらの単語がインデックス化およびクエリ時に確実に削除されるべきであることも確認しました。

よろしくお願いします、
Dan

例の結果:

"facets": {
  "count": 58215,
  "description": {
    "buckets": [
      {
        "val": "a",
        "count": 4,
        "relatedness": {
          "relatedness": 0.98239,
          "foreground_popularity": 0.01279,
          "background_popularity": 0.01279
        }
      },
      {
        "val": "be",
        "count": 6,
        "relatedness": {
          "relatedness": 0.98239,
          "foreground_popularity": 0.01279,
          "background_popularity": 0.01279
        }
      },

フィールド:

<field name="description" type="textgen-stemmed" indexed="true" stored="true" multiValued="false"/>
<fieldType name="textgen-stemmed" class="solr.TextField" positionIncrementGap="100">
  <similarity class="solr.ClassicSimilarityFactory"/>
  <analyzer type="index">
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\.$" replacement=""/>
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\.\s+" replacement=" "/>
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[*,;|/]" replacement=" "/>
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(\S+)(\.(?i:net))" replacement="$1 $2"/>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> <!-- STOPWORDS HERE -->
    <filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1"
            catenateNumbers="1" catenateAll="0" splitOnCaseChange="0" splitOnNumerics="0"/>
    <filter class="solr.FlattenGraphFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" />
    <filter class="solr.KStemFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> <!-- STOPWORDS HERE -->
    <filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0"
            catenateNumbers="0" catenateAll="0" splitOnCaseChange="0" splitOnNumerics="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" />
    <filter class="solr.KStemFilterFactory"/>
  </analyzer>
</fieldType>
返信投稿者:ks-solruserml-bot (2024/06/22 19:13 投稿)

以下は、あなたが見ている現象に関する説明です。

インデックス時のストップワードフィルタリングをWordDelimiterGraphFilterでトークンをさらに操作する前に適用しているため、このような現象が起こっていると思われます。例えば:

"the token-is-retained" => "the" "token-is" "retained" => "the" "token" "is" "retained"

上記の例では、「token-is」はストップワードリストと一致しませんが、その後「token」と「is」に分解されます。したがって、他にも予期しないクエリの動作が発生している可能性がありますが、ファセットではこれがより明確に見えるだけです。

また、トークン化されたフィールド(TextField)でのファセット化は現在、インデックスフィールド値の「逆転」(つまり、docValuesはサポートされていません)を通じてのみ機能することにも注意が必要です。これは非常にリソースを消費する可能性があるため、特定の必要性がない限り避けるのが良いでしょう(あなたにはその必要性があるかもしれませんが)。

さらに、トークンを「分割」および「連結」するように構成されたインデックス時のWordDelimiterGraphFilterは、フレーズクエリにおいて微妙な奇妙な結果を生むことがあります。これが重要である場合には注意が必要です。

Michael

返信投稿者:ks-solruserml-bot (2024/06/22 19:13 投稿)

ありがとう、Michael。それが問題かもしれませんね!チェーンの順序を変更する必要があります。また、WordDelimiterGraphFilterに関する提案にも感謝します。そちらも調べてみます。

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

KandaSearch

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

投稿の削除

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