句読点や大文字と小文字を区別せずに並べ替える範囲クエリを使用して、名前 (個人および機関) のアルファベット順のブラウズを作成しようとしていますが、Solr の分析ツールは、クエリの句読点を正しく削除する必要があることを示唆していますが、クエリ内の句読点は結果に悪影響を及ぼします。
schema.xml から:
<fieldType name="sort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
<analyzer>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="-" replacement=" "/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[\p{Punct}¿¡「」]" replacement=""/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\s+" replacement=" "/>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.ICUFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.TrimFilterFactory" />
</analyzer>
</fieldType>
<field name="authorSort" type="sort" indexed="true" stored="true" multiValued="false" required="true"/>
solrconfig.xml から:
<requestHandler name="/authors" class="solr.SearchHandler">
<lst name="defaults">
<str name="defType">lucene</str>
<str name="echoParams">explicit</str>
<str name="fl">*</str>
<str name="df">authorSort</str>
<str name="sort">authorSort asc</str>
<str name="rows">20</str>
<str name="wt">ruby</str>
<str name="indent">true</str>
</lst>
</requestHandler>
私の実際のクエリは次のようになります。
http://myserver/solr/testCore/authors?q=["Search String" TO *]
を検索するq=["ACA" TO *]
と、トップの結果は「ACA (Academy of Certified Archivists)」で、これは良い結果です。「ACA」で使用されている大文字と小文字を変えても、結果は変わりません。これも良いことです。ピリオド ( q=["A.C.A." TO *]
) を含む頭字語を検索しても、適切な結果がまったく得られず、トップ ヒットは "A3 (ミュージカル グループ)" です。この場合、ピリオドを削除するのではなく、ピリオドでソートしていると思われます。
Solr の分析ツールによると、構成したアナライザーを使用して、「ACA」と「ACA」の両方を「aca」にレンダリングする必要があります。これら 2 つの検索が事実上同等ではない理由を説明するのに途方に暮れています。
(違いが生じる場合、コードがインデックス付けされるデータを送信する前に同じ変換を行っているため、インデックス時の分析は事実上役に立たない. .)
編集:これは、クエリとしての「ACA」の分析がどのように機能するかのスクリーンショットです(Solr分析ツールによる)。
約4か月後に追加:
質問を投稿して解決策が見つからなかったため、分析にカスタム フィルター ファクトリを使用するように切り替えました。これにより、提供されたフィルターでは困難または不可能だった分析を制御できるようになりました。私の最初の試行でも同じ問題がありました。分析は通常の検索では機能しましたが、範囲クエリには適用されませんでした。この問題は
implements MultiTermAwareComponent
、フィルタ ファクトリに追加してオーバーライドする ことで解決されましたgetMultiTermComponent()
。を使用しているため、フィールド値に複数の用語が含まれていないフィールドに対してこれが何をするのかわかりKeywordTokenizer
ません...しかし、問題は修正されました。これは Solr 4.2用でした。