2017-06-06 7 views
0

私は2つの同様の使用例で苦労しています。連結された単語のSolrインデックスの検索

ここに私のインデックスから文書例です:

{ 
     "id":"E850AC8D844010AFA76203B390DD3135", 
     "brand_txt_en":"Tom Ford", 
     "catch_all":["Tom Ford", 
      "FT 5163", 
      "Tom Ford", 
      "FT 5163", 
      "DARK HAVANA"], 
     "model_txt_en":"FT 5163", 
     "brand_txt_en_split":"Tom Ford", 
     "model_txt_en_split":"FT 5163", 
     "color_txt_en":"DARK HAVANA", 
     "material_s":"acetato", 
     "gender_s":"uomo", 
     "shape_s":"Wayfarer", 
     "lens_s":"cerchiata", 
     "modelkey_s":"86_1_FT 5163", 
     "sales_i":0, 
     "brand_s":"Tom Ford", 
     "model_s":"FT 5163", 
     "color_s":"DARK HAVANA", 
     "_version_":1569456572504997895 
} 

問合せ:brand_txt_en_split:tomford

ません結果は!

フィールドタイプは、Solrのデフォルトです:

<fieldType name="text_en_splitting" class="solr.TextField" autoGeneratePhraseQueries="true" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" catenateNumbers="1" generateNumberParts="1" splitOnCaseChange="1" generateWordParts="1" catenateAll="0" catenateWords="1"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/> 
     <filter class="solr.StopFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" catenateNumbers="0" generateNumberParts="1" splitOnCaseChange="1" generateWordParts="1" catenateAll="0" catenateWords="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
    </fieldType> 

私はWordDelimiterFilterFactoryは単語を連結することにより、「tomford」トークンを生成するために期待したが、予想通りそれは働いていないように見えます。

「逆」のユースケースは、次のとおりです。

{ 
    ... "model_txt_en_split": "The Clubmaster", ... 
} 

私はその文書は、このクエリ後に発見されるようにしたい: クラブマスター

私は後者の場合のEdgeNGramフィルタを使用する必要があります推測しますしかし、実際にそれを行う方法を得ることができません。あなたの助け

答えて

1

WordDelimiterFilterFactoryため

おかげでcatenateWordscatenateAllています。あなたの所在地で動作します:

catenateWords: (integer, default 0) If non-zero, maximal runs of word parts will be joined: "hot-spot-sensor's" -> "hotspotsensor" 

catenateAll: (0/1, default 0) If non-zero, runs of word and number parts will be joined: "Zap-Master-9000" -> "ZapMaster9000"` 

単語間のスペースを削除するには、以下のフィルタを試してください。

<filter class="solr.PatternReplaceFilterFactory" pattern="(\s+)" replacement="" replace="all" /> 

schema.xmlを追加/更新した後。サーバーを再起動し、データのインデックスを再作成します。

あなたはfieldTypeのフィールドタイプを試すことができます。

<analyzer> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="25"/> 
</analyzer> 

入力文字列:"John Oliver W Clane"

トークナイザフィルターする:"John Oliver W Clane"

出力トークン:

"John", "John ", "John O", "John Ol", "John Oli", "John Oli", "John Oliv", "John Olive", "John Oliver", "John Oliver ", "John Oliver W", "John Oliver W " 
, "John Oliver W C", "John Oliver W Cl", "John Oliver W Cla", "John Oliver W Clan", "John Oliver W Clane". 

をあなたが同じことを試みることができる別のフィルタがあります。

<filter class="solr.NGramFilterFactory" minGramSize="4" maxGramSize="25"/> 

あなたはSolr Analyzers and Filters

+0

ありがとうアナライザやフィルタの詳細を読むことができます。残念ながらそれは私の質問に対する答えではありません。つまり、他のすべてのトークンを連結したトークンを追加するにはどうすればいいですか? 例: "ホットスポットセンサー" - > "ホットスポットセンサー" –

+0

回答を更新しました。 PatternReplaceFilterFactoryを使用してみてください。一旦schema.xmlを追加/更新します。サーバーを再起動し、データのインデックスを再作成します。 –

+1

私はもう一度アップデートして、あなたに役立つかどうかチェックしてください。 –

関連する問題