ワードセパレーターの問題

トピック作成者:ks-solruserml-bot (2024/09/26 23:22 投稿)
4
OpenOpen

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

こんにちは、

私は、設定された「単語区切り記号」に問題があるのではないかと思います。

例えば、次のようなケースがあります。

  • 検索で「640」を入力した場合、640、640-0 の3つの項目が見つかることを期待しています。
  • 「640-01」で検索した場合、2つの項目が見つかることを期待しています。

#1
artikelnummer_txt:"640*" AND lng:"de"
結果:

"docs":[
  {
    "artikelnummer_txt":"640-01"
  },
  {
    "artikelnummer_txt":"640-02"
  },
  {
    "artikelnummer_txt":"640-01LFM"
  }
]

これは完璧です。「artikelnummer_txt」フィールドの中で640から始まるすべての項目が見つかりました。

#2
artikelnummer_txt:"640-0*" AND lng:"de"
結果:

"docs":[ ]

ただし、"-0"を含めて検索すると、記事が見つかりません。ここでは3つの項目が見つかることを期待しています。

#3
artikelnummer_txt:"640-01*" AND lng:"de"
結果:

"docs":[
  {
    "artikelnummer_txt":"640-01"
  }
]

ここでは1つの項目しか見つかりませんが、2つの項目が見つかることを期待しています。

schema.xml の設定:

<dynamicField name="*_txt" type="text_general" indexed="true" stored="true"/>
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="false">
  <analyzer type="index">
    <tokenizer name="standard"/>
    <filter ignoreCase="true" words="stopwords.txt" name="stop"/>
    <filter name="lowercase"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer name="standard"/>
    <!-- テスト START -->
    <filter name="wordDelimiterGraph" types="wordDelimiters.txt"/>
    <filter name="flattenGraph"/>
    <!-- テスト END -->
    <filter ignoreCase="true" words="stopwords.txt" name="stop"/>
    <filter ignoreCase="true" synonyms="synonyms.txt" name="synonymGraph" expand="true"/>
    <filter name="lowercase"/>
  </analyzer>
</fieldType>

wordDelimiters.txt:

# 数字の前で '$'、'.'、',' で分割しないようにする
$ => DIGIT
. => DIGIT
- => ALPHANUM

この設定では、「-0」を含む検索がうまく機能していないようです。もしかすると「-」の扱いが原因かもしれません。wordDelimiterGraphフィルタがどのように動作しているかを確認し、-をどのように処理するかを再検討する必要があるかもしれません。

何か参考になるアイデアがあれば教えてください。

よろしくお願いします。
Carsten

返信投稿者:ks-solruserml-bot (2024/09/26 23:22 投稿)

ほとんどのクエリパーサーはフレーズ内でワイルドカードをサポートしていません。記事番号で本当にフレーズマッチが必要ですか?もし必要であれば、ComplexPhraseQueryParserを試してみる必要があるかもしれません。
あなたの例は、それほど複雑さを必要としていないように見え、wordDelimiterGraphフィルターなしでも、シンプルな文字列フィールドでも機能するかもしれません。

Matthias

返信投稿者:ks-solruserml-bot (2024/09/26 23:22 投稿)

こんにちは、アイデアをお持ちの方はいませんか?

返信投稿者:ks-solruserml-bot (2024/09/26 23:23 投稿)

私はそのグラフフィルターを使用していませんが、ドキュメントによると、他のいくつかのスプリッター(例えば、splitOnCaseChangesplitOnNumericsgenerateNumberParts)がこれらのトークンに影響を与えている可能性があるようです。

ここでの複雑さの一部は、テキスト指向のフィールドやトークナイザーを使用しながら、構造化された記事識別子を捉えようとしていることに起因しています。これらをテキストコンテンツ内で特定しようとしている場合、異なるトークナイザー(例えば、ClassicTokenizer)や正規表現マッチャーを使用する方が適しているかもしれません。

もしテキスト内でこれらの番号を検索する必要がない場合、単純な文字列インデックスフィールドを使用する方が適しているかもしれません。

返信投稿者:ks-solruserml-bot (2024/09/26 23:23 投稿)

クエリがどのように解析されているかを debugQuery で確認してください。また、これらの文字列がどのように解析されているかも確認してください。Solr 管理画面には解析を確認するページがあります。

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

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

KandaSearch

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

投稿の削除

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