Elasticsearch: фильтрация по словосочетанию вместе с оператором AND - PullRequest
1 голос
/ 12 июля 2020

Как выбрать следующие документы:

  • Должно быть словосочетание «мороженое» (в названии или содержании)
  • И обязательно должно быть слово «шоколад» (в заголовке или содержании)

«мороженое» И шоколад (в заголовке или поле содержимого)

Если слова «лед» и «сливки» отображается, но не как «мороженое», тогда документ не должен возвращаться.

Исходя из MySQL с его красивой круглой скобкой, я не считаю это интуитивно понятным.

"must": [
        {
            "multi_match": {
                "query": "'ice cream' chocolate",
                "fields": [
                    "title",
                    "content"
                ]
            },
        }
    ],

Пример

Документ 1:

  • Название: Мороженое
  • Содержание: Отлично с шоколадом.

Документ 2:

  • Название: Молочный коктейль.
  • Состав: Сделано из сливок, льда и шоколада.

Документ 3:

  • Название: Торт
  • Содержание: Супер вкусно.
  • Примечания: попробуйте его с шоколадом и мороженым.

Он должен найти Документ 1, но не Документ 2 или 3.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы можете использовать множественное соответствие с типом фразы запрос

Поисковый запрос:

    {
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "ice cream",
            "fields": [
              "Title",
              "Content"
            ],
            "type": "phrase"
          }
        },
        {
          "multi_match": {
            "query": "chocolate",
            "fields": [
              "Title",
              "Content"
            ]
          }
        }
      ]
    }
  }
}

Результат поиска:

"hits": [
  {
    "_index": "my_index",
    "_type": "_doc",
    "_id": "1",
    "_score": 2.2868733,
    "_source": {
      "Title": "Ice cream",
      "Content": "Great with chocolate."
    }
  }
]
1 голос
/ 13 июля 2020

Здесь вы go, я использовал те же образцы документов и создал образец минимального сопоставления образцов, чтобы воспроизвести и опробовать вашу проблему.

Я использовал вложенный запрос bool с запросом фразы соответствия чтобы решить вашу проблему, как вам требуется ice cream как фраза, иначе это было бы очень простой проблемой.

{
    "mappings": {
        "properties": {
            "title": {
                "type": "text"
            },
            "content": {
                "type": "text"
            }
        }
    }
}

И поисковый запрос

{
   "query": {
      "bool": {
         "must": [
            {
               "bool": {
                  "should": [
                     {
                        "match_phrase": {
                           "title": "ice cream"
                        }
                     },
                     {
                        "match_phrase": {
                           "content": "ice cream"
                        }
                     }
                  ]
               }
            },
            {
               "bool": {
                  "should": [
                     {
                        "match": {
                           "title": "chocolate"
                        }
                     },
                     {
                        "match": {
                           "content": "chocolate"
                        }
                     }
                  ]
               }
            }
         ]
      }
   }
}

Сначала выбирается do c только как показано ниже:

"hits": [
         {
            "_index": "phrasematch",
            "_type": "_doc",
            "_id": "1",
            "_score": 2.3210695,
            "_source": {
               "title": "Ice cream",
               "content": "Great with chocolate"
            }
         }
      ]
...