Как получить 2 или более документов, если запрос совпадает хотя бы один раз в документе?

#elasticsearch

#эластичный поиск

Вопрос:

Я новичок в elasticsearch. Есть ли способ написать запросы, которые будут соответствовать и перечислять все документы, которые соответствуют определенным доступным полям, включая общие?

Я попытаюсь показать это на примере.

У меня есть система, в которой на основе некоторых критериев мы выдаем рекомендации. Как график. Например. начиная с продукта, имени операционной системы, архитектуры (машины), выпуска, версии и так далее. Я бы сначала хотел, чтобы они совпадали product и osname были общими для всего поиска. Позже выполните поиск, если архитектура имеет x86 значение if true, затем добавьте этот документ в результат, а затем, если release имеет значение of Service Pack 1 , добавьте это снова в результат. В конце результат должен содержать оба 3 документа amp; 4 docs, поскольку оба имеют общие поля product и osname, а один из запросов соответствует фразе «Пакет обновления 1», а другой соответствует «x86»

Ниже приведены 2 мои рекомендации, если запрос удовлетворяет критериям, верните этот документ. В приведенном ниже документе в качестве общих полей указаны product и osname.

 PUT /support/recommendation/3
{
    "recommendation":"Suggested architecture 64 Bit",
    "type":"warning",
    "criteria": {
        "product": ["tar","zip"],
        "osname": "windows",
        "machine": "x86"    
    }   
}
PUT /support/recommendation/4
{
    "recommendation":"Service Pack 2 or more is needed",
    "type":"error",
    "criteria": {
        "product": ["tar","zip"],
        "osname": "windows",
        "release": "Service Pack 1"
    }   
}
 

Мой запрос

 GET /support/recommendation/_search
{   /*search tar, windows, 32bit(x86) amp; SP1*/
    "query": {
        "filtered" : {
            "query": {
                "bool"   : {
                    "must": [
                       {"match": {
                          "product": "tar"
                       }
                       },
                       {"match": {
                          "osname": "Windows"
                       }               
                       }
                    ],
                    "must": [
                       {"match_phrase": {
                          "release": "Service Pack 1"
                       }}
                    ], 
                    "should": [
                       {"match": {  
                          "machine": "x86"
                       }               
                       }
                    ]
                }
            }            
        }
    }
}      
 

Есть ли способ добиться этого?

Ответ №1:

Если вы хотите, чтобы ваши документы отображались в результате, если они соответствуют ЛИБО machine: x86, ЛИБО release: Service Pack 1 , тогда просто используйте предложение should, включающее оба.

 GET /support/recommendation/_search {   /*search tar, windows, 32bit(x86) amp; SP1*/
    "query": {
        "filtered" : {
            "query": {
                "bool"   : {
                    "must": [
                       {"match": {
                          "product": "tar"
                       }
                       },
                       {"match": {
                          "osname": "Windows"
                       }               
                       }
                    ],
                    "should": [
                       {"match": {  
                          "machine": "x86"
                          }               
                       },
                       {"match_phrase": {
                          "release": "Service Pack 1"
                       }
                      }
                    ],
                   "minimum_should_match" : 1
                }
            }            
        }
    } }
 

ОБНОВЛЕНИЕ: добавлено minimum_should_match предложение

Комментарии:

1. Спасибо за ваш быстрый ответ. Я попробовал ваш запрос, поскольку, если я "machine": "x64" даже изменю его, в нем будут перечислены оба документа. Но для моего результата это не должно быть так, как есть в документе 3 x86 , а в документе 4 нет этого критерия.

2. Хм, я не понимаю. В вашем вопросе вы указали, что должны быть возвращены оба документа 3 и 4, потому что один из них соответствует критериям для machine , а другой соответствует критериям для release ? Или вы хотите что-то еще?

3. ах, подождите, теперь я понимаю, что вы имеете в виду. Интересно. Попробуйте добавить minimum_should_match: 1 ?

4. отлично, успехов с ES 🙂