シリアル文字列を多値フィールド内の個々の用語にトークン化することにより、検索要件を解決するアプローチを試みています。基本的に、各ドキュメントには検索用の複数の値が含まれる場合があります。ユーザー検索は、複数値を持つフィールド内の任意の値と照合できますが、すべての用語は、その複数値を持つフィールド内の個々のアイテムの値と一致する必要があります。だからここに私のセットアップがあります
フィールドタイプがあります。それを「トークンサーチ」と呼びましょう
<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 つ
私が試みていることについてさらに情報が必要な場合は、お知らせください。トークンを正確な順序で指定する必要がないように、これを機能させる方法を知っていれば、それは素晴らしいことです。
また、フィールドアナライザーを実行すると、トークンが順不同で一致するため、実際の検索中になぜ一致しないのか少し混乱しています