問題タブ [booleanquery]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
elasticsearch - Elasticsearch の一見ランダムなスコアリングとマッチング
bool
複数のフィールドと照合するために検索を使用しています。フィールドはインデックス時に複数のフィルターを使用して分析されましたが、主にedge_ngram
.
私が抱えている問題は、得点が宙に浮いているように見えることです. 私の検索が最初のフィールドのsavvas
1 つと一致することを期待しますが、それらはずっと後でスコアリングされます。たとえば、スコアの順にリターンを検索すると、次のようになります。first_name
Savvas
savvas
フィールド内の検索語のエッジ n-gram 以外の文字を に置き換え-
、電子メールの長さを変更して ID を保護しました。
ssssssssssssssss
実際、データに存在しないのに検索すると、文字数が最も多いアイテムが返さs
れます。検索に対して手動の ngram を実行していないため、これは予期しないことです。
この問題は、電話番号を検索しようとしたときにも発生します。正確な ngramを持つ電話番号を78
検索すると、その文字を含むすべてのメールが一致します。782
782
Elasticsearch は、フィールドだけでなく、私の検索クエリでも ngrams を実行し、2 つを比較して、どういうわけか短い一致をより大きなものに優先しているようです。
これが私のクエリです:
そしてそれに付随するインデックス設定(冗長で申し訳ありませんが、重要な可能性があるものを除外したくありません):
Kopf プラグインのアナライザーを使用してインデックス設定をテストしたところ、正しいトークンが作成されたようです。
理想的には、インデックスによって作成されたトークンに対してのみ正確に一致し、複数の bool should の一致を優先するのではなく、bool の should クエリの 1 つでより正確な一致を優先します。
ただし、少なくとも正確なトークンのみに一致する場合は幸いです。term
ngram を適用せずに、検索文字列自体をトークン化する必要があるため、検索を使用できません。
私の要件を要約するには:
- 任意の 1 つのフィールドで可能な限り最大の試合で最初に得点します。
- 次に、任意の 1 つのフィールドで可能な一致の最小オフセットによってスコアを付けます。
- 次に、一致したフィールドの数でスコアを付け、より低いオフセットの一致を優先します
- - アップデート: - -
を使用すると、はるかに優れた結果が得られます。まだクエリが難しいフィールドをdis_max
除いて、複数の ngram 一致よりも大きな ngram 一致にうまく一致しているようです。phone
新しいクエリは次のとおりです。
solr - サラウンドクエリパーサーでsolrクエリを否定する方法
solr サラウンド クエリを無効にする方法はありますか? 結果を否定するためのより多くのオプションが得られる場合は、fq フィールドで使用しています。
通常、「-」を先頭に追加してフィルターを無効にします。たとえば、
しかし、サラウンド クエリでこれを行うと、エラーが発生します。
「-」は許可されておらず、孤独な NOT を持つことはできません。これは機能します:
しかし、これは失敗します
elasticsearch - Nest Elasticsearch で bool を使用してクエリを組み合わせる
2 つのフィールドに複数の And/OR 条件を持つ NEST クライアントを使用して、ES からドキュメントを取得する必要があります。
私のクエリは次のとおりです。
以下は私のコードです:
このコードを試してみると、結果に表示されてはならない年には機能しますが、ユーザーが選択する必要がある形式では、選択された形式は表示されますが、それらは表示されません。「should」の代わりに「must」も使用しましたが、何も取得されません。
誰かがそのような同様の問題を抱えていましたか?
c# - Lucene.net 3.0.3 を使用して BooleanQuery が機能しない
Lucene.net で BooleanQuery を使用すると、最初のクエリが機能するのに 2 番目のクエリが機能しないのはなぜですか?
以下は、フィールド SHOPPING で索引付けされたサンプルです。
靴の販売
靴やアクセサリーが大特価。
靴、スニーカー、ヒールを安く買う!
最初のクエリ (うまく機能し、3 つすべてのインデックスが返されます)。
2 番目のクエリ (何も返さない、条件: 「靴」を含むが「アクセサリー」を含まないすべての用語を返す)。
dynamic - Nest Elastic - 動的にネストされたクエリの構築
Nest を使用してネストされたオブジェクトをクエリする必要がありますが、クエリは動的に構築されています。以下は、ネストされた「本」に対してクエリを静的に使用する方法を示すコードです。
問題は、動的な方法で「本」の複数のクエリを (And、OR 演算子を使用して) 組み合わせる必要があることです。たとえば、次の一連の条件を満たす本を取得します。
- 条件1:著者「X」、ISBN「1」の本
- 条件 2: 著者が「X」で、ISBN が「2」の書籍
- 条件3:著者「Z」、ISBN「3」の本
- その他の条件: .....
ここで、ネストされたクエリのフィルターは、次の場合に書籍を取得する必要があります:
条件 1 AND条件 2または条件 3
次の属性を含むクラス名 FilterOptions があるとします。
- フィールド名
- 価値
- 演算子 (次のフィルターを結合します)
指定された FilterOptions 配列をループして、クエリを作成します。
質問:
ネストされたクエリを作成するには何を使用すればよいですか? それは FilterDeciptor ですか?それらを組み合わせる方法は、ネストされたクエリを検索メソッドに追加しますか?
貴重なリンクや例をお勧めしてください。