0

PathHierarchyTokenizerFactory トークナイザーのパスを使用してファセットを作成し、ユーザーがアプリケーションで部門をフィルタリングできるようにしようとしています。その理由は、部門が子を持つことができ、これが階層構造を処理する最良の方法のように思われたからです。

現在、次のscheme.xmlを使用しています

<fieldType name="text_path" class="solr.TextField">
    <analyzer>
        <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="|" />
    </analyzer>
</fieldType>

<field name="department_path" type="text_path" indexed="true" stored="true" multiValued="true"/>

ただし、これはマッチングに問題を引き起こしています。「department_path:Ovens & Hobs|Gas Hobs」を検索する場合の例をいくつか挙げると、次のように一致するはずです:

  • オーブンとホブ|ガスコンロ
  • オーブン・コンロ|ガスコンロ|ガスコンロ(60cm)

以下はすべきではありません:

  • オーブン&ホブ
  • オーブンとホブ|オーブン
  • ワークトップ
  • ワークトップ|ホブ スプラッシュバック

現在のセットアップでは、次のような同様の名前を含む結果が得られます。

  • ワークトップ & スプラッシュバック|キッチン スプラッシュバック|ホブ スプラッシュバック|ホブ スプラッシュバック スチール|ホブ スプラッシュバック
  • オーブン、コンロ|電気コンロ|IH コンロ|IH コンロ 60cm

誰かが私がどのようにタイプを変更すべきか考えているなら、それは素晴らしいことです.

ありがとう

編集:

私のschema.xmlをに変更した後

<fieldType name="descendent_path" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="\" />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory" />
    </analyzer>
</fieldType>

ほとんど機能していますが、「オーブンと調理台|ガス調理台|ガス調理台(60cm)」などのリーフ ノードを検索すると、一致しないはずの結果が得られます。

4

1 に答える 1

2

わかりましたので、将来これを読む人にとって、私のコードには2つの問題がありました. 1 つ目は、インデックス作成とクエリの両方で PathHierarchyTokenizerFactory を実行していたことです。私のニーズでは、インデックス作成中にこのトークナイザーを実行する必要がありました。結果のタイプは次のとおりです。

<fieldType name="descendent_path" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="|" />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory" />
    </analyzer>
</fieldType>

もう 1 つの問題は、入力を適切にエスケープしていなかったため、一部の部門名で問題が発生したことでした。

于 2012-12-30T13:27:00.950 に答える