Строковый запрос Elasticsearch для соответствия регулярному выражению

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

Я знаю, что возможно и наоборот (создайте запрос регулярного выражения для сопоставления строки в документе elasticsearch), но могу ли я сделать запрос на основе строки и сопоставить регулярное выражение, сохраненное в документе, с помощью elasticsearch?

Например, у меня есть документ, заполненный данными, включая ввод (регулярное выражение) и вывод (описывающий регулярное выражение), как показано ниже:

{
  "input": "[0-9]+ ?kg",
  "output": "weight"
}

Могу ли я сделать запрос со строкой «67kg», чтобы сопоставить регулярное выражение и получить это:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test1",
        "_type" : "type",
        "_id" : "XqXucGgBXOzlaMdqiLcI",
        "_score" : 1.0,
        "_source" : {
          "input" : "[0-9]+ ?kg",
          "output" : "weight"
        }
      }
    ]
  }
}

person grobec    schedule 22.01.2019    source источник


Ответы (1)


Вы можете добиться чего-то подобного с помощью Percolate Запросить функциональность.

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

Вам нужно создать индекс со специальным типом поля - percolator. Например,

PUT /my-index
{
    "mappings": {
        "_doc": {
            "properties": {
                "input": {
                    "type": "keyword"
                },
                "query": {
                    "type": "percolator"
                }
            }
        }
    }
}

После этого добавьте документ (это будет запрос, который будет соответствовать вашему полю input с регулярным выражением)

Например,

PUT /my-index/_doc/1
{
    "query" : {
        "regexp" : {
            "input" : "[0-9]+( kg)?"
        }
    }
}

Кроме того, вы можете, например, попробовать разные запросы здесь, в зависимости от ваших потребностей.

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

GET /my-index/_search
{
    "query" : {
        "percolate" : {
            "field" : "query",
            "document" : {
                "input" : "67 kg"
            }
        }
    }
}
person Mysterion    schedule 22.01.2019