1

ここで詳しく説明されている問題に行き詰まっています。ベッドとバスの情報を格納するテキスト フィールドがあり、インデックスを作成するときに、2 つのベッドと 3 つのバスに対してそれぞれ 2b 3bt のような値を格納します。最後に、「2 ベッド 3 バス」、「ベッド 2 3 バス」、「2 ベッド ルーム 3 バス」、「2bd 3bth」などのクエリをサポートする必要があります。

これを達成するために、以下のように text_general タイプのテキスト フィールドを使用します。

    <field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>


    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
       <tokenizer class="solr.StandardTokenizerFactory"/>
       <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />       
       <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
       <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(?i)((\d\.?\d{0,2})\s*(bed\s*rooms|bed\s*room|beds|bed|bdr|bd|br|b)|(bed\s*rooms|bed\s+room|beds|bed|bdr|bd|br|b)\s*(\d\.?\d{0,2}))" replacement="$2$5b" />
       <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(?i)((\d\.?\d{0,2})\s*(bath\s*rooms|bath\s*room|baths|bath|bth|bt|bh|ba)|(bath\s*rooms|bath\s*room|baths|bath|bth|bt|bh|ba)\s*(\d\.?\d{0,2}))" replacement="$2$5bt" />     
       <tokenizer class="solr.StandardTokenizerFactory"/>
       <filter class="solr.TrimFilterFactory" updateOffsets="true"/>        
       <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />        
       <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    </fieldType>

管理インターフェイスでSolrクエリを試してみましたが、「6ベッド6バス」または「6ベッドルーム6バスルーム」のような中間スペースが同時に「6ベッド6バス」で正しい場合を除いて、すべての組み合わせでほとんど正常に機能しています結果。これは、このクエリのsolrに渡したパラメーターを含むURLです

    /solr/select?q=6b+6ba&wt=xml&indent=true&q.op=AND

これらのケースのそれぞれについて、Solr 管理分析インターフェースを確認しましたが、違いはまったく見つかりませんでした。分析フェーズで同じ結果が生成されるため、これらのクエリは両方とも同様に機能することを期待していました。これら2つのクエリが同じように動作しないのはなぜですか?

これは、問題の 2 つのクエリの solr 管理者分析インターフェイスに表示されるものです。

    For input : 6 beds 6 bath room,

    PRCF 6b 6bath room
    PRCF 6b 6bt
    ST   6b | 6bt
    TF   6b | 6bt
    SF   6b | 6bt
    LCF  6b | 6bt

    For input : 6b 6bt
    PRCF 6b 6bt
    PRCF 6b 6bt
    ST   6b | 6bt
    TF   6b | 6bt
    SF   6b | 6bt
    LCF  6b | 6bt

入力と出力の例- 上記のフィールド定義を使用して試した入力の例をいくつか示します。注: (#) は単なるシリアル番号であり、入力の一部ではありません。

   (1) 2beds 3baths Fresno
   (2) 3baths 2beds Fresno
   (3) Fresno 2bedroom 3bathroom
   (4) beds2 3baths Fresno
   (5) beds2 bathrooms3 Fresno

上記はすべて今でも問題なく機能しています。現在のフィールド定義でまだ懸念されている入力をいくつか示します

   (6) 2 beds 3 baths Fresno
   (7) 2 bed rooms 3 baths Fresno
   (8) Fresno 2 bed room  3 baths
   (9) Fresno 3baths 2   bed rooms

同じシリアル番号の順序で分析フェーズ後に上記の入力に対して期待する出力は次のとおりです (2beds 3 baths のインデックスを作成している間、データを 2b 3bt としてインデックス付けします)。

   (1) 2b 3bt Fresno
   (2) 3bt 2b Fresno
   (3) Fresno 2b 3bt
   (4) 2b 3bt Fresno
   (5) 2b 3bt Fresno
   (6) 2b 3bt Fresno
   (7) 2b 3bt Fresno
   (8) Fresno 2b 3bt
   (9) Fresno 3bt 2b 

しかし、この時点までは、Solr 管理者の分析インターフェイスで確認したのとまったく同じ出力を分析で生成できるので、うまくやっていると思います。ここでの本当の問題は、クエリを取得して正しい検索結果を取得できることです。入力の最初のセクション (つまり) #5 までですが、#6 から #9 までの入力については結果が得られません

これは、入力 #1 で試したサンプル クエリ形式です。例) 2beds 3baths Fresno

    /solr/collection1/select?q=2beds+3baths+Fresno&wt=xml&indent=true&q.op=AND

そして、これは#6用です。つまり)2ベッド3バスフレズノ

/solr/collection1/select?q=2+beds+3+baths+Atlanta&wt=xml&indent=true&q.op=AND
4

1 に答える 1

0

ここで適用した最終的な解決策は次のとおりです。

Query time Analyzer からベッドとバスの PatternReplaceCharFilterFactory を削除し、サーブレットからの入力テキストに対して同様のパターン置換を行いました。

それでは、次の入力テキストについて

    2 beds 3 baths Fresno

私のサーブレットコードから、私はそれをに変換します

    2b 3bt Fresno

これは、私が solr に渡して作業するものです...そして、現在は正常に動作しています

これは、text_general フィールドの変更されたフィールド タイプ定義です。

    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
         <tokenizer class="solr.StandardTokenizerFactory"/>
         <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
         <filter class="solr.LowerCaseFilterFactory"/>
     </analyzer>
     <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.TrimFilterFactory" updateOffsets="true"/>       
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.LowerCaseFilterFactory"/>
     </analyzer>
  </fieldType>
于 2013-03-14T04:33:28.017 に答える