2017-09-11 24 views
1

私は弾性検索を使用して始めました。私はすべてが正しくセットアップされている。私はFirebase + Flashlight + Elastic Searchを使用しています。奇妙な出力クエリ弾性検索

私のフロントエンドでは、私は異なる検索のparamsに基づいてクエリを構築しています。 Firebase /search/requests/のノードにそれらを挿入します。懐中電灯はこれをピックアップし、応答を/search/responseに入れます。これは魅力的です!

ただし、クエリを正しく記述する方法がわかりません。私は2つのmustmatchのクエリを組み合わせようとすると、奇妙な結果を得ています。私はQuery DSLを使用しています。 deliverables/doc

弾性検索で私の文書には、次のスキームを持っています。

... 
{ 
    "createdBy" : "[email protected]", 
    "createdOn" : 1501200000000, 
    "deadLine" : 1508716800000, 
    "description" : { 
    "value" : "dummy description" 
    }, 
    "key" : "<FBKEY>", 

    "programmes" : [ { 
    "code" : "95000", 
    "name" : "Test programme", 
    "programYear" : 2017 
    } ], 
    "projects" : [ { 
    "projectCode" : "113200", 
    "projectName" : "Test project", 
    "projectYear" : 2017 
    } ], 
    "reportingYear" : 2017, 
    "status" : "Open", 
    "type" : "writing", 
    "updatedBy" : "[email protected]", 
    "updatedOn" : 1501200000000, 
}, 
... 

クエリの構造は次のとおりです。

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "createdBy": "[email protected]" 
      }, 
      "match": { 
      "programmes.code": "95000" 
      } 
     } 
     ] 
    } 
    } 
} 

私の出力には、正確には2つのフィールドがないドキュメントもありますか?彼らのスコアも非常に低いです。これは正常ですか?

私のマッピング、自動的しかし、それはまだ私の両方のフィールドにフィルタリングしないことによって、奇妙な結果を与える、私はこのクエリを試してみました懐中電灯

enter image description here

アップデート1

を使用して作成must句がに使用

{ 
    "query": { 
     "bool": { 
     "filter": { 
      "bool": { 
       "must": [ 
        { 
        "match": { 
         "programmes.code": "890000" 
        } 
        }, 
        { 
        "match": { 
         "createdBy": "[email protected]" 
        } 
        } 
       ] 
      } 
     } 
     } 
    } 
} 

答えて

2

クエリコンテキスト(すべての文書がスコアの降順で返されます)ので実行され、スコアに貢献します。 see link

あなたはそれをフィルタとして実行したい場合は、次のクエリを使用します。

{ 
    "query": { 
    "bool": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "match": { 
       "createdBy": "[email protected]" 
       } 
      }, 
      { 
       "match": { 
       "programmes.code": "95000" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

注:デフォルトでは

は、文字列フィールドを解析し、マッピングを更新文字列フィールドをnot_analyzedとし、filterクエリを使用します。参考:mapping-intro

+0

チャンドラさんありがとうございました!どのように私はそれを逃した可能性があります... – Rover

+0

私はこのクエリを試しましたが、それでも私は両方のフィールドでフィルタリングしないことによって私に奇妙な結果をもたらします。開始ポストの更新を参照してください – Rover

+0

あなたはフィールドを分析しないように 'match'を' term'に置き換えることができます。 –