2

solrフィールドのデータは次のようになります。

<str name="property_Info_Hd">320 GB SATA 7200RPM</str>
<str name="property_Info_Hd">320GB SATA</str>

<str name="property_Info_Memory">4 GB of DDR2</str>
<str name="property_Info_Memory">2GB of DDR3</str>

フィールドは動的( "property_ *")であるため、どちらの場合も同じアナライザーを使用します。

現在、「2GB」を検索すると、「2GB」のドキュメントが返されますが、「2GB」(空白)が欠落しています。

質問は、このフィールドタイプをスキーマに設定して、空白がある場合とない場合の結果に一致するようにするにはどうすればよいですか?

例えば:

+(property_Info_Memory:( "320gb"))を検索すると、「320GB」と「320GB」に一致する上記の最初の行の両方が返されます

フィールドタイプの設定方法は次のとおりです。

<fieldType name="textFilter" class="solr.TextField" 
        positionIncrementGap="100">
       <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.WordDelimiterFilterFactory" 
                splitOnCaseChange="0" 
                splitOnNumerics="0" 
                stemEnglishPossessive="0" 
                catenateWords="1" 
                catenateNumbers="1" 
                catenateAll="1" 
                preserveOriginal="1" 
                generateWordParts="1" 
                generateNumberParts="1"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.ISOLatin1AccentFilterFactory" />
       </analyzer>
    </fieldType>

splitOnCaseとsplitOnNumericsのバリエーションを使用してみましたが、どれも成功しませんでした。その場合、結果は空白(320 GB)のあるものと一致し、空白のないもの(320GB)を見逃します。

ほとんどのドキュメントには空白のないデータが含まれているため、現在の設定はそのためです。

よろしくお願いします。

4

2 に答える 2

4

分析ツールから作業しました。あなたはそれを試してみたいかもしれません:-

<fieldType name="textFilter" class="solr.TextField" 
        positionIncrementGap="100">
       <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.WordDelimiterFilterFactory" 
                catenateWords="1" 
                catenateNumbers="1" 
                catenateAll="1" 
                preserveOriginal="1" 
                generateWordParts="1" 
                generateNumberParts="1"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
       </analyzer>  
       <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.WordDelimiterFilterFactory" 
                splitOnNumerics="1" 
                preserveOriginal="1"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
       </analyzer>  
 </fieldType>

分析 -

インデックス時間-2GBのデータ

クエリ時間-2GBトークン-2GB、2 GB

分析ではトークンとして2GBが生成され、インデックスで一致が示されます。

于 2011-09-27T18:20:35.043 に答える
0

私はこれを達成するための2つの方法を知っています:

  1. 2つのフィールドにデータを保存させ、それぞれが異なる方法でトークン化されます(つまり、コピーフィールドを使用します)
  2. カスタム同義語フィルターを使用して1つのフィールドを作成する

#2の方が優れたソリューションですが、Javaを作成する必要があります。WordDeliminterFilterを拡張することをお勧めします。シノニムの作成方法については、SynonymTokenFilterのソースを参照してください。

于 2011-09-27T17:52:02.433 に答える