web-dev-qa-db-ja.com

SOLR copyFieldディレクティブの使用方法

私は3つの異なるフィールドを保持する、かなり単純なSOLR構造を持っています。

iD、テキスト、タグ

の中に schema.xml以下を設定しました

<uniqueKey>id</uniqueKey>
<defaultSearchField>text</defaultSearchField>
<solrQueryParser defaultOperator="AND"/>
<copyField source="tags" dest="text"/>

ただし、タグとしてのみ表示される単語を検索すると、ドキュメントが見つかりません。

ここでの私の質問は、copyFieldは、アナライザーが実行される前(インデックスとクエリ)に here またはクエリアナライザーの直前に発生しますか?


[〜#〜]編集[〜#〜]

アナライザーの定義:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.LowerCaseFilterFactory" />              
        <filter class="solr.SnowballPorterFilterFactory" language="German" />
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.LowerCaseFilterFactory" />              
        <filter class="solr.SnowballPorterFilterFactory" language="German" />
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
</fieldType>

とフィールドタイプの定義(デフォルトの設定とほとんど同じです):

<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>

そして最後にフィールド定義:

<fields>
    <field name="id" type="string" indexed="true" stored="true" required="true" />
    <field name="text" type="text" indexed="true" stored="false" multiValued="true" />
    <field name="tags" type="text" indexed="false" stored="false" />
</fields>
<uniqueKey>id</uniqueKey>
<defaultSearchField>text</defaultSearchField>
<solrQueryParser defaultOperator="AND"/>
<copyField source="tags" dest="text"/>
23
harpax

CopyFieldはドキュメントにインデックスが付けられるときに行われるため、インデックスアナライザの前にあります。 2つの異なるフィールドに同じ入力テキストを入力したようです。しかしその後は、両方のフィールドに定義したアナライザーにすべて依存します。

30

Q = tags:xyzを検索すると、インデックスを付けずに送信したため、xyzは見つかりません。

デフォルトの検索を行う場合、はい、ただし Solr wiki に従って、copyfieldを検索する必要があります。

スキーマに任意の数の宣言を含めて、インデックスに追加されるドキュメントの「ソース」フィールドに表示されるデータを複製するようにSolrに指示することができます

インデックスに「タグ」を追加しなかった場合も、「タグ」のコピーフィールドにインデックスが作成されなくなると思います。

3
Joyce

CopyFieldを使用して、既存のフィールドに追加のテキストを追加しようとしたことがありません。 Solrはそれを連結したり、2番目の値として追加したりできると思います。

しかし、ここにいくつかのアイデアがあります:

  1. テキストフィールドが空白である文書を試してください。おそらく構造の下に記載されていません。テキストが完全に空白で始まるかどうかに関係なく、タグがメインテキストに入れると、違いがあるように見えますか?

  2. 2番目のフィールドを宣言し、text2と呼びます。そして、2番目のcopyFieldディレクティブを介してタグをtext2にコピーします。このtext2フィールドには他に何もありません。おそらくフィールドで言及されていないため、コンテンツを取得する必要があります。

どちらの場合も、以前と同様に、スキーマブラウザーで結果を確認します。あなたがどうやってそれを見つけるのか聞いてみたいです!

1
Mark Bennett