0

solr フィールドで PackageTag

<field name="PackageTag" type="text_en_splitting" indexed="true" stored="true" required="false" multiValued="true"/>

私は次の値を持っています

"playing @@*"

今、私は「遊び」を探しています。結果に表示されます。
しかし、@@* で検索しているときは検索しません。単語区切りでは省略されます。

ユーザーが特別なキャラクターを検索できるようにする方法はありますが、それでも単語区切りを使用できますか?

4

3 に答える 3

1

ここには 2 つの問題があります。

  • まず、Solr で独自の fieldType を作成し、"@" と "*" をストップワードとして使用しないように構成する必要があります。

schema.xml で次のようにします。

<types>
        <fieldType name="myTextFieldType" class="solr.TextField" positionIncrementGap="100">
            <analyzer type="index">
                <tokenizer class="solr.StandardTokenizerFactory" />
                <filter class="solr.StopFilterFactory" ignoreCase="true"
                    words="stopwords.txt" enablePositionIncrements="true" />
            </analyzer>
            <analyzer type="query">
                <tokenizer class="solr.StandardTokenizerFactory" />             
                <filter class="solr.StopFilterFactory" ignoreCase="true"
                    words="stopwords.txt" enablePositionIncrements="true" />
            </analyzer>
        </fieldType>
        </types>

次に、「PackageTag」フィールドにその fieldType を使用する必要があります。

<field name="PackageTag" type="text_en_splitting"
  • 次に、「conf」ディレクトリ (schema.xml と同じディレクトリ) で、stopwords.txt ファイルを作成または編集し、「@」と「*」を追加します。そこに、各文字を 1 行に入れるだけです。

    @

    *

" *" 文字は Lucene クエリ (ワイルドカード) の特殊文字でもあるため、クエリでエスケープする必要があります。*" " に置き換えることで " "をエスケープできます\*。このようなもの:

PackageTag:bla\*

「bla*」を含むフィールドを検索します。

于 2013-10-16T15:08:02.353 に答える
0

protwords.txt ファイルに単語区切り文字を追加してから、索引付けとクエリ時に protwords を使用するフィルターを適用する必要があります。(たとえばsolr.WordDelimiterFilterFactoryprotected="protwords.txt"パラメーターを使用)。

このようにして、必要に応じてトークン化され、クエリ時に削除されません。

于 2013-10-14T07:24:52.940 に答える
0

Lucene の特殊文字のリストを思い出せませんが\、文字の前に (バック スラッシュ) を付けてエスケープしようとしましたか?

それでもうまくいかない場合はAnalyzer、フィールドのインデックスに使用している を確認してください。StandardAnalyzerあなたの特殊文字で面白いことをするかもしれないので、別のアナライザーを検討するか、独自のアナライザーをロールすることができます。

于 2013-10-12T14:01:01.290 に答える