3

複数のフィールドでオートコンプリートを実行することについての投稿を見ましたが、複数値のフィールドでオートコンプリートを実行することについては投稿していません。

私のオートコンプリート機能は、非複数値フィールドで機能しています。

私の問題は、複数値フィールドでクエリを実行すると、ドキュメントがそのクエリに一致する場合は常に、そのドキュメントの複数値フィールドのすべてのフィールドがファセット結果に返されることです。

以下は、Solr4クックブックで提案されているものと同様の私のスキーマです。

 <fieldType name="text_autocomplete" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

<field name="publisherText-str" type="string" indexed="true" stored="false" multiValued="true"/>
<field name="publisherText-ac" type="text_autocomplete" indexed="true" stored="true" required="false" multiValued="true"/>

ご覧のとおり、publisherTextは複数値のフィールドです。オートコンプリート機能をテストするには、次のようなクエリを実行します。

/select?q=publisherText-ac:new&facet=true&facet.field=publisherText-str&facet.mincount=1&rows=0

クエリは「新規」であり、これは一連のドキュメントと一致します。ただし、ファセット結果セットには、一致する各ドキュメントの他のpublisherText値(複数値フィールドに含まれる)が含まれています。

更新:「new」をクエリする場合、結果セットには「NewYorkTimes」と「TimesNewRoman」が含まれている必要がありますが、中置問題を解決する必要はありません。「KnewtonGazette」が結果セットに含まれている必要はありません。

ファセットの結果にクエリに一致する値のみを含める方法はありますか?または、multiValuedフィールドをより適切に処理する完全なオートコンプリート機能をサポートする別の(より良い?)方法はありますか?

ありがとう。

4

3 に答える 3

3

最適な方法は、別のコレクションまたはコアを作成し(クラウドを使用しているかどうかに応じて)、データにインデックスを付けて、目的のクエリ結果のクエリにすることだと思います。もちろん、それが不可能な場合もありますが、あなたの場合はそれを選択してください。このようなコアでは、オートコンプリートに関連するフィールドとデータのみが含まれるため、ほとんどの場合、元のコアよりも小さく、用語が少なくなり、クエリが高速化されます。それに加えて、このようなコアまたはコレクションはオートコンプリートクエリ用に最適化されており、パフォーマンスがさらに向上します。

ただし、フィルタリングが必要な場合は、複数のコア/コレクションのアプローチを採用できない場合は、ハイライト表示が最善の方法となる可能性があります。このような場合、タームバークターをオンにし、FastVectorHighlightingを使用して、Solrハイライトのパフォーマンスを向上させることができます(http://solr.pl/en/2011/06/13/solr-3-1-fastvectorhighlighting/)。

于 2013-02-14T21:35:32.683 に答える
1

これまで、次の2つの方法を使用しました。

(A)ファセットの使用に固執し、正規表現またはString.startsWithを使用して結果を減らす必要があることを受け入れます。YUI3オートコンプリートプラグインのようなフロントエンドコンポーネントを使用している場合、これは実際にはそれほど悪くないかもしれません。このプラグインは、多くのことをしなくても、この機能をすでに提供しています。

(B)クエリに追加して強調表示を使用します。

&hl=true&hl.fl=publisherText-ac

ヒットごとに、強調表示コンポーネントは、強調表示タグを含む一致する値を返します(デフォルト<em>)。これは、オートコンプリートフィールドが複数の入力フィールドから取得されており、結果を検索して一致する値が含まれているフィールドを見つけたくない場合にさらに役立ちます。ただし、結果のリストには重複が含まれる場合があります。

私は両方のアプローチを使用しています。(A)単一のフィールドでのオートコンプリート、(B)複数のフィールドからオートコンプリートを取得する場合です。ハイライト結果に含まれているタグを削除しようとしまし<em>たが、それはまったく不可能であることが証明されています(タグを変更することはできますが、完全に削除することはできません)。

(ここでSOLR 4.0を使用)

于 2013-02-14T13:02:38.917 に答える
1

このパラメーターを使用するだけfacet.prefix=newで、solrにそれらのエントリーをフィルターで除外させることができます。私も考えているのは、ここでngramを作成しないようにすることです。ファセットを作成して使用すると、facet.prefixすでにトリックが実行されます。うまくいけば、あなたはあまり多くのユニークな用語を持たず、パフォーマンスはうまくいくでしょう。

于 2013-02-14T18:52:49.683 に答える