ここで詳しく説明されている問題に行き詰まっています。ベッドとバスの情報を格納するテキスト フィールドがあり、インデックスを作成するときに、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