3

基本的に、Solrに複数値フィールドの各レコードで検索パラメーターを検索してもらいたいと思います。例を読んでください。

Solrを使用してデータのインデックスを作成しています。特定の製品に一致する並列配列(複数値フィールドの形式)のアプリケーションデータがあります。次の例を参照してください。ここで、make、model、およびyearは複数値のフィールドです。

<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
<-solr record end->

フィルタクエリ(&fq =)を使用して選択範囲を絞り込んでいます。問題は、誰かが2000 Acura Integraを検索すると、上記のレコードと一致することですが、製造元、モデル、および年のデータが並行してエンコードされているため、この製品には実際には2000AcuraIntegraがありません。Solrは、makeフィールドのmake、modelフィールドのmodel、およびyearフィールドのyear(必要に応じて)を照合し、この結果を返します。私の並列処理は尊重していません。これまでのところ、私のクエリは次のようになります。


fq=make:"acura"&fq=model:"integra"&fq=year:2000 (I would normally escape URL characters when I POST to Solr, this is just an example)

したがって、私の解決策は、サマリーフィールドと呼ばれる別の多値フィールドを作成することでした。このフィールドでは、すべての製造元、モデル、年、およびその他のデータ(エンジンなど)をスペースで区切ってまとめます。複数の単語を含む用語が誤って検索パラメータと一致しないように、単語を引用符で囲む必要があります。上記の例は次のようになります。

<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
summary: "acura" "integra" "1997" "3.4", "acura" "rsx" "2004" "4.5", "acura" "rsx" "2000", "4.5"
<-solr record end->

次に、クエリに次を追加します。

summary:(""acura" AND "integra" AND "2000")

これをクエリに追加すると、要約フィールドにacura integra 2000がないため、このレコードは表示されなくなると思います。ただし、これは機能しません。レコードはまだ出ています。私は困惑しています。誰かがこの問題の解決策を持っていますか?それは何日も私を殺してきました。

基本的に、Solrに複数値フィールドの各レコードで検索パラメーターを検索してもらいたいのですが、これは可能ですか?私がやろうとしていることをするためのより良い方法はありますか?

ありがとう

4

3 に答える 3

3

サマリーフィールドなしで並列処理を維持する方法はまだわかりませんが、サマリーフィールドを使用して並列処理を行う方法はわかりました。ANDステートメントを使用する代わりに、複数値フィールドの各レコードで一致するものを検索します(ANDされた各用語は、複数値フィールドの異なる行と一致する可能性がありますが、必ずしも同じ行である必要はありません)。代わりに、正確な用語を入力します。元の要約レコードを作成したのと同じ順序で検索し、〜演算子を使用します。

次の例を見てください。

以下は、私が照合したい複数値フィールドの行の1つにある要約フィールドの内容です。 "Honda" "Accord" "2004" "3.5L"

これが私が実行するクエリです: summary_field:("\"Honda\" \"2004\"")

上記のクエリだけでは機能しません。アプリケーションからのユーザー入力を元の要約フィールドが作成されたのと同じ順序にする機能を使用できますが、アプリケーションのユーザーはデータ(製造元、モデル年)を任意の順序で入力できるため、一致させようとしているデータの間にある別の言葉かもしれません。上記の例では、ホンダ2004をそのレコードに一致させたいと思います。しかし、アコードはその間にあります。

この問題を回避するには、〜n演算子を使用します。ここで、nは、検索している用語の間にある他の用語の最大数です。したがって、代わりに次を使用する場合:

summary_field:("\"Honda\" \"2004\""~1)

ホンダと2004年の間に、もう1つの言葉がある可能性があると言っています。したがって、この上記のクエリは一致します。サマリーフィールドに複数の用語を追加した場合でも、同じ順序の値でクエリを実行し、あいまい検索ロジックで2つの値の間の最大距離となる数値を使用する限り、クエリは常に正しく一致します。正しい要約フィールド。したがって、並列処理を維持するために要約フィールドに20個のフィールドを追加する場合は、ユーザーが選択できる単語間の最悪のシナリオで可能な最大距離である〜18を使用する必要があります。

于 2010-02-12T08:03:52.670 に答える
3

スキーマが正しくないようです。データを完全に非正規化し、車両ごとに1つのドキュメントを作成する必要があります。「車両」の意味は、実行する検索の種類によって異なります。たとえば、可能なスキーマは次のようになります。

sku: 1234
make: acura
model: integra
years: 1997
engines: 3.4, 4.5

sku: 1235
make: acura
model: rsx
years: 2000, 2004
engines: 4.5

要約フィールドは、make + model + years+enginesのcopyFieldになります。

于 2010-02-11T13:33:51.547 に答える
0

次のようにクエリを実行することはできませんか?

make:acura AND model:integra AND year:2000

つまり、メーカーとモデルの周りに引用符がありません。

于 2010-02-11T14:43:04.270 に答える