web-dev-qa-db-ja.com

SOLRの大文字と小文字を区別しない検索

SOLR検索に問題があります。
次のようなデータがあります:
enter image description here

私はsolr adminを使用して、次のようなクエリを使用してこのデータを検索します。

address_s:*Nadi*

そしてそれらのデータを見つけました。しかし、このクエリを使用すると:

address_s:*nadi*

何も見つかりません。
グーグルで検索して、次のスクリプトでフィールドを作成するための回答を見つけました。

<fieldType name="c_text" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>

    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

これらのスクリプトをschema.xmlにコピーして貼り付けましたが、それでも機能しません。私は何をすべきか?誰か助けてもらえますか?

16
Praditha

Address_sフィールドは次のように定義する必要があります-

<field name="address_s" type="c_text" indexed="true" stored="true"/>

デフォルトのschema.xmlを使用している場合、この定義は前に来る必要があります-

<dynamicField name="*_s"  type="string"  indexed="true"  stored="true"/>

これは、分析を行わない文字列フィールドタイプとして定義します。

ワイルドカードクエリは分析されません。
したがって、インデックス時にクエリで小文字のフィルターを適用すると、address_s:*nadi*は機能します。
ただし、クエリaddress_s:*Nadi *は、インデックス内のNadinadiと一致せず、クライアント側でクエリを小文字にする必要があるため、一致しません。

12
Jayendra

これをフィールドタイプとして使用しました。

<fieldType name="string" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

そして、私のフィールドを使用して定義しました:

<field name="address" type="string" indexed="true" stored="true"/>

結果:私のドキュメントは、フィールドを(挿入されたように)正しいケースで返し、大文字と小文字を区別せずに検索できます(大文字と小文字の両方を使用)...

バージョン:Solr 3.6

7
Jeff Maes

あなたのaddress_sフィールドはこれを使用していますかc_text schema.xmlのフィールドタイプ?

インデックスが前の構成で作成されている場合は、変更を考慮に入れるためにすべてのインデックスを再作成する必要があります。

5
jpountz

私はこのようなものを使用しました... schema.xmlに新しいfieldTypeを入れました

_<fieldType name="newType" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ReversedWildcardFilterFactory" />
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ReversedWildcardFilterFactory" />
      </analyzer>
 </fieldType>
_

大文字と小文字を区別しないようにするフィールドに新しいタイプを割り当てます。次に、次の形式でsolrクエリを作成する必要があります。fieldName:(*fieldValue\ *)

1
Manos

の代わりに type="string"フィールドを定義するtype="text_general"(デフォルトのschema.xmlで定義)。そのプロパティはignore case=true

1
Shimon Benattar