0

私がモデルを持っているとすると

class Firm < ActiveRecord::Base
  searchable do
    text :name
  end
end

そして、solrのschema.xmlには

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="30"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

そして私は名前=='Ойл-М(Oil-M)'の会社を持っています

検索しようとすると

Sunspot.search(Firm) do
  fulltext 'Ойл-М'
end

それから私は何も得られません

検索しようとすると

Sunspot.search(Firm) do
  fulltext 'Ойл'
end

それから私は必要になります

両方のクエリでこの会社を見つけることができるように、Solrおよび/または検索をどのように設定する必要がありますか?

4

1 に答える 1

3

あなたが持っているので、あなたのNGramFilterは最後の「M」を切り取っていますminGramSize=2。設定minGramSize=1は機能しますが、これによりSolrが保存する必要のあるデータのサイズが大幅に増加し、ノイズも増加します。

Solrでフィールドにインデックスを付けてクエリを実行すると、次の2つのことが起こります。

  1. フィールドは小さな部分に分割されます(トークン化されます)、
  2. 次に、各トークンがフィルタリングされます。

これは、インデックス作成とクエリで別々に発生します。

この場合、StandardTokenizerFactory、StandardFilter、LowercaseFilter、およびNGramFilterを使用してフィールドにインデックスを付け、NGramFilterを除くすべてを使用してフィールドにクエリを実行します。

「Ойл-М(Oil-M)」をSolrにインデックス付けすると、次のようになります。

StandardTokenizerFactory: ['Ойл', 'М', 'Oil', 'M']
StandardFilter: ['Ойл', 'М', 'Oil', 'M']
LowerCaseFilter: ['ойл', 'м', 'oil', 'm']
NGramFilter: ['ой', 'йл', 'ойл', 'oi', 'il', 'oil']

'm'は完全に消えます。「Ойл-М」を検索しても、検索するものがない ため、何も返されません。M

使用する正当な理由がない限り、NGramFilterを切り取り、標準のロシア語のfieldTypeを使用します。

<fieldType name="text_ru" class="solr.TextField" positionIncrementGap="100">                                                            
  <analyzer>                                                                                                                            
    <tokenizer class="solr.StandardTokenizerFactory"/>                                                                                  
    <filter class="solr.LowerCaseFilterFactory"/>                                                                                       
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ru.txt" format="snowball" enablePositionIncrements="~
    <filter class="solr.SnowballPorterFilterFactory" language="Russian"/>                                                               
  </analyzer>                                                                                                                           
</fieldType> 

注:ここでは、インデックスアナライザとクエリアナライザの違いがないことに注意してください。各クエリは、インデックスが作成されたときとまったく同じ方法で変換されます。

于 2012-11-19T01:48:51.653 に答える