Как написать простой запрос регулярного выражения с помощью elasticsearch в python?

Я пытаюсь написать простой запрос регулярного выражения, используя elasticsearch в python, который просто не будет работать. Может ли кто-нибудь сказать мне, где я ошибаюсь?

result = es.search(index="my-index", body={"query": {"regexp": {"Name": "Vi.*" }}})

Индексированный документ представляет собой список имен, в котором есть и мое имя (Виттал Бхандари). Приведенный выше запрос всегда дает пустые результаты, когда вместо этого он должен возвращать мое имя. Документ правильно проиндексирован, и другие запросы работают нормально. Например, запрос соответствия дает требуемый результат.

result = es.search(index="my-index", body={"query": {"match": {"Name": "Vitthal" }}})

В чем проблема с regexp-запросом, который я пишу, что он не даст никакого результата? Какие-либо предложения?

** РЕДАКТИРОВАТЬ: ** Сопоставление имени приведено ниже:

"Name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },

person VITTHAL BHANDARI    schedule 23.06.2020    source источник
comment
Добавьте образец документа и сопоставление имени также   -  person Gibbs    schedule 23.06.2020


Ответы (2)


Согласно вашему отображению

"Name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }

У вас есть анализатор по умолчанию.

Чтобы это работало:

{"query": {"regexp": {"Name": "vi.*" }}}

Используйте нижний регистр.

Причина, по которой Vi.* не работает:

regexp — это term запрос. Это не full text search запрос.

В отличие от полнотекстовых запросов, запросы на уровне терминов не анализируют условия поиска. Вместо этого запросы на уровне терминов соответствуют точным терминам, хранящимся в поле.

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

Справочник

person Gibbs    schedule 23.06.2020
comment
Спасибо за решение. Это сработало. Пока мы здесь, не могли бы вы помочь мне еще с одним делом. Следующим шагом в моей программе является получение строки поиска в качестве ввода от пользователя, т. е. в приведенном выше примере строка Vi должна приниматься в качестве ввода от пользователя во время выполнения. Допустим, строка хранится в переменной str. Как сформулировать запрос с помощью str? - person VITTHAL BHANDARI; 23.06.2020
comment
Пожалуйста, ответьте на мой комментарий по адресу здесь - person Gibbs; 23.06.2020

Использовать

{
  "query": {
    "regexp": {
      "Name": "vi.*"
    }
  }
}

or

{
  "query": {
    "regexp": {
      "Name.keyword": "Vi.*"
    }
  }
}
person Joe Sorocin    schedule 23.06.2020