Elasticsearchは初めてなので、ここに質問があります。 elasticsearchを使用して検索クエリを実行し、複数の用語でフィルターを実行したいです。
ユーザー「tom」を検索したい場合、ユーザー「isActive = 1」、「isPrivate = 0」、「isOwner = 1」のすべての一致を取得したいと思います。
これが私の検索クエリです
"query":{
"filtered": {
"query": {
"query_string": {
"query":"*tom*",
"default_operator": "OR",
"fields": ["username"]
}
},
"filter": {
"term": {
"isActive": "1",
"isPrivate": "0",
"isOwner": "1"
}
}
}
}
2つの用語を使用する場合、それは魅力のように機能しますが、3つの用語を使用する場合は機能しません。
助けてくれてありがとう!!
bool filter
を使用して、すべての用語をAND
に使用する必要があります。
"query":{
"filtered": {
"query": {
"query_string": {
"query":"*tom*",
"default_operator": "OR",
"fields": ["username"]
}
},
"filter": {
"bool" : {
"must" : [
{"term" : { "isActive" : "1" } },
{"term" : { "isPrivate" : "0" } },
{"term" : { "isOwner" : "1" } }
]
}
}
}
}
コメントの1つにあるように、最近のESバージョンでは構文が変更されています。 Elasticsearch 6。+を使用しており、クエリ(質問など)でワイルドカードと一連の用語を使用する場合、次のようなものを使用できます。
GET your_index/_search
{
"query": {
"bool": {
"must": [
{
"wildcard": {
"your_field_name_1": {
"value": "tom*"
}
}
},
{
"term": {
"your_field_name_2": {
"value": "US"
}
}
},
{
"term": {
"your_field_name_3": {
"value": "Michigan"
}
}
},
{
"term": {
"your_field_name_4": {
"value": "0"
}
}
}
]
}
}
}
また、ワイルドカードクエリに関する documentation から:
このクエリは多くの用語を反復処理する必要があるため、時間がかかることに注意してください。ワイルドカードクエリが非常に遅くなるのを防ぐために、ワイルドカード用語はワイルドカード*または?のいずれかで始まってはなりません。
これがお役に立てば幸いです。