1.複雑なクエリ
複合クエリはまた、別のクエリの動作を制御することができます複雑なクエリに加えて、いくつかの単純なクエリ、より複雑なクエリの要件を一緒に置くことです。
1.1 constant_score
constant_scoreクエリは、クエリ戻る文書内の同じスコアを有するフィルタに一致するクエリ条件をパッケージの他のタイプであってもよいです。我々は、検索語の頻度への影響を懸念されていない場合は、検索結果をランク付けし、あなたは、パッケージconstant_scoreクエリクエリフィルタまたはフィルタ文を使用することができます。
例としては、次のとおりです:
{
"クエリ":{
"constant_score":{
"フィルタ":{
"期間":{
「市」:「北京」
}
}
}
}
}
次のようにJavaの例は以下のとおりです。
MatchQueryBuilderクエリ= QueryBuilders.matchQuery( "タイトル"、 "新闻").minimumShouldMatch( "90%")。
QueryBuilders.constantScoreQuery(クエリ).boost(3.0F);
1.2ブールクエリ
ブールクエリは、must_not、フィルタオプションは、単純なクエリの間の論理接続を表している必要があり、シンプル一緒クエリ、利用必見の任意の番号にすることができ、ゼロからどこにでも現れることができ、各オプションの何倍にそれらの意味は次のとおりです。
文書は、論理演算子のオプションMUST位相ブロックでクエリを一致させなければなりませんしなければなりません。
文書は、クエリ条件万一に一致するオプションは、OR論理演算にブロックの位相と一致しない場合があります必要があります。
must_not:逆に、オプションのクエリ条件に一致する文書が返され、必見れることはありません。
フィルタ:ちょうどフィルタリング果たし、同じとフィルタオプションのドキュメント内の照会条件に一致しなければなりませんが返されますが、フィルタが得点しません。
例としては、次のとおりです:
{
"クエリ":{
"BOOL":{
"必見":[
{
"一致":{
「タイトル」:「共有自転車」
}
}、
{
"期間":{
「地区」:「昌平区」
}
}
]、
"べき":[
{
"一致":{
「アドレス」:「朝陽区」
}
}
]
}
}
}
1.3 dis_maxクエリ
dis_maxクエリHAVEブールクエリといくつかの接触はまた、いくつかの違いがあり、dis_maxクエリのサポート、複数の同時クエリは、文書の任意のタイプおよびクエリ句の一致を返すことができます。ブールクエリは、スコアは、クエリの唯一の最高のスコアを使用して、dis_maxクエリの組み合わせのクエリに一致するすべてと異なる場合があります。
{
"クエリ":{
"dis_max":{
"tie_breaker":0.7、
"ブースト":1.2、
"クエリ":[
{
「一致」:{「アドレス」:「北京市朝陽区」}
}、
{
"一致":{
「タイトル」:「北京朝陽区。」
}
}
]
}
}
}
1.4 function_scoreクエリ
function_scoreクエリがドキュメントのクエリースコアを変更することができ、クエリは、いくつかのケースで非常に有用である、文書がスコアリング関数によって計算されるような高いコストをスコア、あなたは伝統的な採点方法を置き換えるために、フィルタに加えて、カスタムスコアリング機能の方法を使用することができます。
使用function_scoreクエリは、ユーザーがクエリを定義する必要があり、複数のスコアリング機能のスコアリング機能は、個別に各文書のスコアを計算するために照会します。
{
"クエリ":{
"function_score":{
"クエリ":{
"function_score":{
"クエリ":{
"一致":{
"タイトル": "javaの编程"
}
}、
"関数": [
{
"field_value_factor":{
「フィールド」:「価格」、
"因子":0.1、
"修飾子": "ln1p"
}
}
]、
"score_mode": "乗算"、
"max_boost":10、
"ブースト":1
}
}、
"関数": []、
"score_mode": "乗算"、
"boost_mode": "サム"、
"max_boost":10、
"ブースト":1
}
}
}
次のようにJavaの例は以下のとおりです。
MatchPhraseQueryBuilder titleQuery = QueryBuilders.matchPhraseQuery( "タイトル"、 "Javaの编程");
FieldValueFactorFunctionBuilder係数= ScoreFunctionBuilders.fieldValueFactorFunction( "価格")修飾子(FieldValueFactorFunction.Modifier.LN1P).factor(0.1F)。
FunctionScoreQueryBuilder.FilterFunctionBuilder [] filterFunctionBuilders = {
新しいFunctionScoreQueryBuilder.FilterFunctionBuilder(因子)
}。
FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(titleQuery、filterFunctionBuilders)。
FunctionScoreQueryBuilderクエリ= QueryBuilders.functionScoreQuery(functionScoreQuery).boostMode(CombineFunction.SUM)。
1
2
3
4
5
6
7
詳細なスコアリング機能
クエリを後押し1.5
クエリのスコアを調整するための2つのクエリのシナリオの必要性を高め、クエリを高めることは一緒に2つのクエリのクエリスコアの1を減少させ、パッケージ化されます。
クエリは、正、負とnegative_boost三つの部分を含み、正のクエリスコアは横ばい高め、負のクエリーは、文書のスコアを減らす、negative_boost減少負の重みを示します。
バック時点で2018年に出版した本のためのJavaクエリのタイトル、。
{
"クエリ":{
"後押し":{
"ポジティブ":{
"一致":{
"タイトル": "javaの"
}
}、
"負":{
"範囲":{
"publishAt":{
"LTE": "2018年1月1日"
}
}
"negative_boost":0.2
}
}
}
13
次のようにJavaの例は以下のとおりです。
MatchPhraseQueryBuilder titleQuery = QueryBuilders.matchPhraseQuery( "タイトル"、 "Javaの");
RangeQueryBuilder publishAt = QueryBuilders.rangeQuery( "publishAt")のLTE( "2018年1月1日")。
QueryBuilders.boostingQuery(titleQuery、publishAt).negativeBoost(0.2F)。
2.ネストされたクエリ
2.1サンズ問い合わせ
ここでお店や商品に、例えば、彼らはあなたがESの文書間の親子関係を伝える必要がありますお店や商品の関連付けを実行したい場合は、ここでフィールドを指定する、異なる種類のデータベース内の2つのテーブルの同等に属しstore2product、この関係を維持するために、フィールドの型が参加して、彼らの関係を指定します。
2.1.1親子関係のインデックスを作成します。
PUT店
{
"マッピング":{
"プロパティ": {
"名前": {
「タイプ」:「テキスト」、
"アナライザ": "ik_max_word"、
"search_analyzer": "ik_smart"
}、
"store2product":{
「タイプ」:「参加」、
"関係":{
"storeid": "商品コード"
}
}
}
}
}
2.2.2関係書類を追加します
親文書(ショップ)を追加し、親フィールドを指定します
PUTストア/ 1
{
「名前」:「実食品フランチャイズレコード店」
"store2product": "storeid"
}
子文書(商品)を追加し、同じスライス内の子文書と親文書を必要とし、あなたは親IDルートIDを指定する必要があります
PUTストア/ 2?ルーティング= 1
{
「名前は」:「お茶に醸造されたクランベリー粉末梅ジュースインスタントの本当の味を作成し、果汁飲料千グラム梅生」
"store2product":{
「名前」:「商品コード」、
"親": "1"
}
}
店舗での2.2.3クエリ商品
HAS_PARENTクエリを使用して、storeidとしてPARENT_TYPEを指定します
GETストア/ _search
{
"クエリ":{
"HAS_PARENT":{
"PARENT_TYPE": "storeid"、
"クエリ":{
"一致":{
「名前」:「フードショップ」
}
}
}
}
}
次のようにJavaの例は以下のとおりです。
MatchQueryBuilder nameQuery = QueryBuilders.matchQuery( "名前"、 "食料品店")。
HasParentQueryBuilder hasParentQueryBuilder =新HasParentQueryBuilder( "storeid"、nameQuery、真の);
2.2.4クエリは、商品の店に属しています
has_childクエリを使用して、タイプフィールドの商品コードを指定します
GETストア/ _search
{
"クエリ":{
"has_child":{
「タイプ」:「商品コード」、
"クエリ":{
"一致":{
「名前」:「酸っぱい梅風味」
}
}
}
}
}
次のようにJavaの例は以下のとおりです。
MatchQueryBuilder nameQuery = QueryBuilders.matchQuery( "名前"、 "梅ジュースの味");
HasChildQueryBuilder hasChildQueryBuilder =新HasChildQueryBuilder( "商品コード"、nameQuery、ScoreMode.None)。