5

シリアル文字列を多値フィールド内の個々の用語にトークン化することにより、検索要件を解決するアプローチを試みています。基本的に、各ドキュメントには検索用の複数の値が含まれる場合があります。ユーザー検索は、複数値を持つフィールド内の任意の値と照合できますが、すべての用語は、その複数値を持つフィールド内の個々のアイテムの値と一致する必要があります。だからここに私のセットアップがあります

フィールドタイプがあります。それを「トークンサーチ」と呼びましょう

<fieldType name="tokensearch" class="solr.TextField" positionIncrementGap="100">
   <analyzer type="index">
        <tokenizer class="solr.PatternTokenizerFactory" pattern="\|\s*" />
        <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
       <analyzer type="query">
        <tokenizer class="solr.PatternTokenizerFactory" pattern="\ \s*" />
        <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

サンプルデータフィールドは

<arr name="tokensearch">
    <str>a:3|b:3|c:3|d:5|e:5</str>
    <str>a:1|b:3|c:5|d:4|e:2</str>
    <str>a:2|b:3|c:3|d:2|e:1</str>
</arr>

これは基本的にsolrで多次元配列を作成するため、次のようになります

a[0]=array(a:3,b:3,c:3..)
a[1] = array(a:1,b:3,c:5..)

その部分は正常に機能していますが、"a:1 c:5" 何が起こるかを検索すると、クエリパーサーは、上部の配列の個々の項目に a:1 と c:5 の両方が含まれるフィールドを与えると言う必要があります

現在、「a:1 b:3 c:5」は配列 [1] と一致しますが、「a:1 c:5」は一致しません。

これが私のセットアップです。私の目標は、渡されたすべてのトークンが一致しなければならない多値フィールド内で値の指定可能な組み合わせを持つことです。

現時点での私のクエリは非常に単純です q=tokensearch:"a:1 c:3"

クエリで遊んでみましたが、それが必要なものに最も近いようです q=tokensearch:"a:1" tokensearch:"c:3"&q.op=AND - a:1 と c: を含むドキュメントを返します:多値配列の異なるエントリに 3 つ

私が試みていることについてさらに情報が必要な場合は、お知らせください。トークンを正確な順序で指定する必要がないように、これを機能させる方法を知っていれば、それは素晴らしいことです。

また、フィールドアナライザーを実行すると、トークンが順不同で一致するため、実際の検索中になぜ一致しないのか少し混乱しています

4

0 に答える 0