私はあなたが求めていることを正確に実装しました。それは本当にうまくいきます。注意すべき 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に対して検索します。