Мне нужно динамически создавать эластичный поисковый запрос, основанный на запросах AND, OR.
Пользователь вводит строку, похожую на формат SQL:
((("query1 query2" OR query3) OR query4) AND (query5 OR query6)) AND query7
Я анализирую это в массив:
[
'AND' => [
[
'AND' => [
[
'OR' => [
[
'OR' => [
'" query1 query 2"',
'query3'
]
],
'query4'
]
],
[
'OR' => [
'query5',
'query6'
]
]
]
],
'query7'
]
]
И на основе этого массива мне нужно сделать поиск по одному полю.
Что-то вроде:
{"bool":{"must":[{"match":{"title":"research"}},{"match":{"title":"lecturer"}}]}}
Но я застрял во вложенных условиях. Пожалуйста, порекомендуйте.
Вы можете использовать вложенные bool
для вложенных условий.
((("query1 query 2" OR query3) OR query4) AND (query5 OR query6)) AND query7
может быть выражено как:
{
"query" : {
"bool":{
"must" : [
{
"bool":{ // ((("query1 query 2" OR query3) OR query4) AND (query5 OR query6))
"must" : [
{
"bool":{ // (("query1 query 2" OR query3) OR query4)
"should" : [
{
"bool":{ // ("query1 query 2" OR query3)
"should" : [
{"match": // query1 query2},
{"match": // query3}
]
}
},
{"match": // query4}
]
}
},
{
"bool":{ // (query5 OR query6)
"should" : [
{"match": // query5},
{"match": // query6}
]
}
}
]
}
},
{match": //... query7}
]
}
}
}
Я создал небольшую библиотеку из этого
SqlElasticSearchQueryConverter