Источник вашей проблемы в том, что вы на самом деле не понимаете, как массивы работают в упругом, из документов :
нет выделенного типа данных массива.
То есть, когда вы индексируете массив (который не напечатан вложен ), вы теряете возможность запрашивать отдельные элементы в нем из-за того, что упругость "выравнивает" массив.
У вас есть два варианта:
- Более правильное решение - переиндексировать ваши данные, составить предложение для ввода вложенный , тогда вы можете запросить каждый элемент по отдельности.
новая структура будет выглядеть примерно так:
{
"mappings": {
"doc": {
"properties": {
"sentence": {
"type": "nested",
"properties": {
"value": {
"type": "text"
}
}
}
}
}
}
}
Однако, поскольку я не знаком с вашим продуктом и нуждаюсь, возможно, это решение не для вас, так как это может повлиять намногие другие запросы у вас уже работают.
Следовательно, вариант № 2. Используйте scripting для фильтрации документов:
(этот скрипт - быстрый пример, который я вынул, выможет написать более эффективную версиюоптимизировать время выполнения, предполагая, что во многих документах нет ни одного из этих условий, которые вы запрашиваете, было бы целесообразно добавить query
(аналогично тому, что вы делали) перед действием filter
, чтобы просто выполнить итерации по «подозрительным» совпадениям.)
{
"query": {
"bool": {
// the must is optional and only here to filter out documents that are not relevant, you should test this on your data to see if its needed.
"must": {"query_string": {"default_field": "sentence", "query": "1060 AND 1101"}},
"filter": {
"script": {
"script": {
"lang": "painless",
"source": `
boolean matched = false;
String[] queries = new String[] {'1060', '1101'};
for (int i = 0; i < doc['sentence.keyword'].length; i++) {
int count = 0;
for (int j = 0; j < queries.length; j++) {
if (doc['sentence.keyword'][i].indexOf(queries[j]) > -1) {
count += 1;
}
}
if (count === queries.length) {
matched = true;
}
}
return matched
`
}
}
}
}
}
}
Как я уже говорил, вариант 2 является менее "правильным" решением и гораздо менее эффективен. но при необходимости он рабочий.