Кибанский запрос на предложение (слова с заданным c порядком) с 4 ди git числом - PullRequest
1 голос
/ 22 марта 2020

Я довольно новичок в Elasticsearch и хочу найти приведенное ниже предложение в message поле

завершено в ???? мс

где ???? являются числами

У меня есть это на данный момент

{
  "query": {
    "query_string": {
      "analyze_wildcard": true,
      "default_field": "*",
      "query": "(message:completed) AND (message:in) AND (message:/[0-9]{4}/) AND (message:ms)"
    }
  }
}

Но проблема в результате также содержит сообщения, подобные этому, которые меня не интересуют enter image description here

Как указать порядок совпадения слов?

Заранее спасибо

Я тоже безуспешно пробовал:

{
  "query": {
    "regexp": {
      "message": {
        "value": "completed in [0-9]{4} ms"
      }
    }
  }
}

1 Ответ

2 голосов
/ 23 марта 2020

регулярное выражение работает на анализируемых терминах, регулярное выражение как фраза не будет работать. Вы можете использовать span span для достижения того же самого. с точки зрения производительности, лучший вариант - обрабатывать это во время индексации, возможно, создать структурированный журнал, в котором подтекст для запроса является отдельным полем

{
  "query": {
    "span_near": {
      "clauses": [
        {
          "span_term": {
            "message": {
              "value": "job"
            }
          }
        },
        {
          "span_term": {
            "message": {
              "value": "completed"
            }
          }
        },
        {
          "span_term": {
            "message": {
              "value": "in"
            }
          }
        },
        {
          "span_multi": {
            "match": {
              "regexp": {
                "message": "[0-9]{4}"
              }
            }
          }
        },
        {
          "span_term": {
            "message": {
              "value": "ms"
            }
          }
        }
      ],
      "slop": 0,
      "in_order": true
    }
  }
}
...