私はここ数か月からElasticSearchを使用していますが、複雑なクエリを渡す必要がある場合は、それでも複雑になります。
複数の「タイプ」を検索する必要があり、各タイプを独自の「フィルター」で検索する必要があるクエリを実行したいのですが、「検索結果」を組み合わせる必要があります
例えば:
友達の「ユーザータイプ」のドキュメントを検索すると同時に、指定されたキーワードに従って、好きな「オブジェクトタイプ」のドキュメントを検索する必要があります。
OR
「AND」句と「NOT」句の両方を持つクエリ
クエリの例:
$options['query'] = array(
'query' => array(
'filtered' => array(
'query' => array(
'query_string' => array(
'default_field' => 'name',
'query' => $this->search_term . '*',
),
),
'filter' => array(
'and' => array(
array(
'term' => array(
'access_id' => 2,
),
),
),
'not' => array(
array(
'term' => array(
'follower' => 32,
),
),
array(
'term' => array(
'fan' => 36,
),
),
),
),
),
),
);
このクエリはaccess_id = 2のユーザーを検索することを目的としているため、ID32のフォロワーとID36のファンがあってはなりません。
しかし、これは機能していません。
編集:変更されたクエリ
{
"query": {
"filtered": {
"filter": {
"and": [
{
"not": {
"filter": {
"and": [
{
"query": {
"query_string": {
"default_field": "fan",
"query": "*510*"
}
}
},
{
"query": {
"query_string": {
"default_field": "follower",
"query": "*510*"
}
}
}
]
}
}
},
{
"term": {
"access_id": 2
}
}
]
},
"query": {
"field": {
"name": "xyz*"
}
}
}
}
}
このクエリを実行した後、2つの結果が得られました。1つはフォロワー: "34,518"とファン: "510"で、もう1つはファン: "34"ですが、そうではありません。結果の2番目だけになります。
何か案は?
今月私が行ったプレゼンテーションのスライドをご覧になるとよいでしょう。これは、クエリDSLがどのように機能するかの基本を説明しています。
クエリの問題は、フィルタが正しくネストされていないことです。 and
フィルターとnot
フィルターは同じレベルですが、not
フィルターはand
の下にある必要があります。
curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1' -d '
{
"query" : {
"filtered" : {
"filter" : {
"and" : [
{
"not" : {
"filter" : {
"and" : [
{
"term" : {
"fan" : 36
}
},
{
"term" : {
"follower" : 32
}
}
]
}
}
},
{
"term" : {
"access_id" : 2
}
}
]
},
"query" : {
"field" : {
"name" : "keywords to search"
}
}
}
}
}
'
「BOOL」で試してみました
{
"query": {
"bool": {
"must": [
{
"term": {
"access_id": 2
}
},
{
"wildcard": {
"name": "xyz*"
}
}
],
"must_not": [
{
"wildcard": {
"follower": "*510*"
}
},
{
"wildcard": {
"fan": "*510*"
}
}
]
}
}
}
正解です。
しかし、私はそれがこのように使用されるべきかどうかわかりませんか?