2

いくつかのチュートリアルを読み、Solr のドキュメントを閲覧しました。しかし、私にははっきりしないことが 1 つあります。説明させてください:

次の文書が索引付けされると仮定しましょう:

<doc>
  <field name="id">R12345</field>
  <field name="title">My title</field>
  <field name="content">My Content</field>
</doc>

このドキュメントとは対照的に、インデックスには「docType」と呼ばれる追加のフィールドが 1 つ含まれている必要があります。この追加のインデックス フィールドは、「完了規則」を使用して入力する必要があります。この背後にあるアイデア:

id が文字 "R" で始まる場合、文字列 "Resolve" をインデックスのフィールド docType に書き込みます。id が文字「C」で始まる場合、文字列「Contribute」をインデックスのフィールド docType に書き込みます。

上記のドキュメントは、次のフィールドを含むインデックスで利用できるはずです。

id=R12345
title=My Title
content=My Content
docType=Resolve

私の考えは、これにアナライザーを使用することです。アナライザーの結果は、通常どおりインデックスのフィールド「id」に書き込まれますが (元のテキストのコピーのみ)、結果の「解決」または「貢献」は別のフィールドに書き込まれる必要があります。

私の基本的な質問は次のとおりです。これは、Analyzer (Java の一部を切り取ったもの) でどのように達成できますか? さらに複雑にするには、インデックス フィールド「docType」を検索可能にし、検索結果で利用できるようにする必要があります。フィールド ID と docType のスキーマはどのようになりますか?

前もってありがとう トビアス

4

1 に答える 1

7

インデックス付きの値のみが必要な場合は、スキーマ アプローチで十分です。必要な処理を実行する新しいフィールド タイプを作成し、新しいタイプのフィールドを作成し、値をコピーするためのコピー フィールドを設定しますid

<fieldType name="doctypeField" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.PatternReplaceFilterFactory" pattern="([CR]).*" replacement="$1" replace="all" />
    <filter class="solr.PatternReplaceFilterFactory" pattern="C" replacement="Contribute" replace="all" />
    <filter class="solr.PatternReplaceFilterFactory" pattern="R" replacement="Resolve" replace="all" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

<field name="doctype" type="doctypeField" indexed="true" stored="false" required="false" />

<copyField source="id" dest="doctype"/>

これから保存された値を取得しないことに注意してください。それが必要な場合は、ドキュメントを Solr にフィードする前に docType の値を把握しておく必要があります。たとえば、コンテンツ ソースが SQL の場合は、SQL クエリでドキュメントを作成します。

于 2010-10-19T08:03:04.317 に答える