Запрос ElasticSearch, сочетающий совпадение строк и значение вложенного поля - PullRequest
1 голос
/ 24 февраля 2020

У меня есть запрос ElasticSearch, который выглядит следующим образом:

{
  "query": {
        "query_string": {
                "query": "Lorem*",
                "fields": ["search_names", "name^2"]
        }
    }
}

Для документов, которые выглядят так.


{
        "member_name" : "Lorem Ipsum",
        "complaint_periods" : [
            {
                "period": "01/01/2001 - 31/12/2001",
                "complaints": "10"
            },
            {
                "period": "01/01/2002 - 31/12/2002",
                "complaints": "0"
            },
            {
                "period": "01/01/2003 - 31/12/2003",
                "complaints": "3"
            },
            {
                "period": "01/01/2004 - 31/12/2004",
                "complaints": "100"
            }
         ],
        "search_names" : [
            "Lorem Ipsum",
            "dolor sit amet",
            "varius augue",
            "Aliquam fringilla"
        ]
}

Таким образом, я могу получать документы, основываясь на том, насколько близко их имя и имена для поиска к моему запросу.

Требование заключается в том, что текстовое поле поиска должно извлекать наиболее близкое имя, совпадающее с запросом, однако при относительно схожих именах документ с числом жалоб выше порогового значения 10 за прошедший период времени должен появляются в результатах поиска выше, чем те, у которых меньше 10.

Поэтому мне нужно передать ключ для периода времени, например, "01/01/2001 - 31/12/2001", и повысить документы оценка, если значение жалобы за этот период> 10.

Текущее отображение индекса выглядит следующим образом.

"mappings": {
    "properties": {
        "member_name": {
            "type": "text"
        },
        "search_names": {
            "type": "text"
        },
        "complaint_periods": {
            "type": "nested",
            "properties": {
                "period": {
                    "type": "text",
                },
                "complaints": {
                    "type": "integer"
                }
            }
        }
    }
}

В настоящее время я читаю Вложенные запросы как возможное решение ... но я довольно свободен sh для ES, поэтому очень хочу получить мнения о типах запросов / структуре, которыми я должен быть используя для этого.

Есть совет?

Спасибо.

1 Ответ

0 голосов
/ 24 февраля 2020

Так что, кажется, я смог решить эту проблему с помощью следующего запроса:


"query": {
    "bool": {
      "must": {
        "query_string": {
          "query": "Lorem*",
          "fields": ["search_names", "member_name^2"]
        }
      },
      "should": {
        "nested" : {
            "path" : "complaint_periods",
            "query" : {
                "bool" : {
                    "should" : [
                      { "term" : {"complaint_periods.period" : "01/01/2001 - 31/12/2001"} }
                    ]
                }
            }
        }
      }
    }
  }

Я переключился на использование логического запроса, поскольку согласно docs

Запрос, который сопоставляет документы, соответствующие логическим комбинациям других запросов

Итак, насколько я понимаю, первая часть моего запроса указывает, что результат "должен" содержать совпадение строки с мой запрос в одном из 2 полей.

Вторая часть - это вложенный запрос. В то время как мои данные выглядят как дата, они на самом деле хранятся и запрашиваются как категории, поэтому я переключил тип complaint_period на тип «ключевое слово» вместо «текст». Это позволяет мне использовать его в запросе «term» (точное совпадение текста, категориальное).

Поскольку вложенный запрос - «должен», результат не ДОЛЖЕН совпадать, но если это так, он должен повысить оценка и пу sh это далее вверх по списку результатов.

В документах по вложенным запросам также есть примеры, которые позволили бы мне повысить в зависимости от количества жалоб, например:

{ "range" : {"complaint_periods.complaints" : {"gt" : 5}} }

, которые мне, возможно, понадобится добавить позже на.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...