0

タグ付け機能にオートコンプリートを追加したいと考えています。

いくつかの質問:

  1. プレフィックスと文字列の中間の両方に一致を含むオートコンプリート候補のリストを生成するにはどうすればよいですか? たとえば、ユーザーが「自動」と入力した場合、オートコンプリートの提案には「オートコンプリート」や「ビルドの自動化」などの用語を含める必要があります。

  2. 複数単語のタグを許可し、タグの区切りとしてコンマ (",") を使用したいと考えています。そのため、使用者がスペース バーを押すと、同じタグを入力し続けますが、コンマ キーを押すと、新しいタグを開始します。それ、どうやったら出来るの?

Django、jQuery、MySQL、および Solr を使用しています。上記の2つの機能を実装するための最良の方法は何ですか?

4

2 に答える 2

2
  1. NGramTokenizerFactoryを使用します。分析コンソールを使用して、その仕組みを確認してください。この記事も参照してください(ただし、EdgeNGram の代わりに NGram を使用します)。
  2. 「タグ」が何を意味するのかわかりませんが、多値フィールド「タグ」があると思うので、コードはデータを Solr に送信する前に入力を解析 (「、」で分割) します。
于 2010-06-19T16:42:15.343 に答える
2

私はあなたが求めていることを正確に実装しました。それは本当にうまくいきます。注意すべき 2 つの問題があります。

  • 結果リストの概要での強調表示は機能せず、提案された回避策もこの特定のケースでは機能しません。
  • ドキュメントに長いタイトルがあり、表示時に切り詰められている場合、表示されていない単語のプレフィックスで一致する可能性があります。もちろん、これを処理する方法はいくつかあります。
  • そして、将来のバージョンでは、タイトルの最初の方の言葉を、最後の言葉よりももう少し重み付けしたいと思います. これは、前の項目を軽減する 1 つの方法です。

前の回答と同様に、上にリンクされている同じ記事から始めますが、Edge NGram アナライザーが必要です。追加することは、空白のトークン化も行うことです。

そして、これらの変更を schema.xml ファイルに加えます。この例では、"title" というフィールドが既に定義されており、それも表示したいと想定しています。オートコンプリート プレフィックス マッチングにのみ使用される 2 番目のフィールドを作成します。

ステップ 1: Edge NGram Text フィールド タイプを定義する

<types>
  <!-- ... other types ... -->

  <!-- Assuming you already have this -->
  <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
    ... normal text definition ...
  </fieldType>

  <!-- Adding this -->
  <fieldType name="prefix_edge_text" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <!-- not using enablePositionIncrements="true" for now -->
      <filter class="solr.StopFilterFactory" words="stopwords.txt" />
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <!-- No need to create Edges here -->
      <!-- Don't want stopwords here -->
    </analyzer>
  </fieldType>

</types>

ステップ 2: 新しいフィールドを定義する

<fields>
  <!-- ... other fields ... -->

  <!-- Assuming you already have this -->
  <field name="title" type="text" indexed="true" stored="true" multiValued="true"/>

  <!-- Adding this -->
  <field name="prefix_title" type="prefix_edge_text" indexed="true" stored="true" multiValued="true" />

</fields>

ステップ 3: インデックス作成中にタイトルのコンテンツをプレフィックス フィールドにコピーする

<!-- Adding this -->
<copyField source="title" dest="prefix_title" />

スキーマはこれで終わりです。覚えとけ:

  • 通常の検索を行う場合でも、通常のタイトルフィールドに対して検索を行います。
  • オートコンプリート検索を行うときは、prefix_titleに対して検索します。
于 2011-01-19T01:33:49.220 に答える