Нужна помощь в совмещении поиска по шаблону с запросом диапазона вasticsearch? - PullRequest
1 голос
/ 12 января 2020

Я пытаюсь объединить подстановочный знак с диапазоном дат в эластичном поисковом запросе c, но не дает ответа на основании подстановочного поиска. Он возвращает ответ с элементами, которые имеют неправильный диапазон дат.

{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              {
                "wildcard": {
                  "hostName": "*abc*"
                }
              },
              {
                "range": {
                  "requestDate": {
                    "gte": "2019-10-01T08:00:00.000Z"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

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

{
  "index_history": {
    "mappings": {
      "applications_datalake": {
        "properties": {
          "query": {
            "properties": {
              "term": {
                "properties": {
                  "server": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "index-data-type": {
        "properties": {
          "attributes": {
            "properties": {
              "wwnListForServer": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          },
          "hostName": {
            "type": "keyword"
          },
          "requestDate": {
            "type": "date"
          },
          "requestedBy": {
            "properties": {
              "id": {
                "type": "keyword"
              },
              "name": {
                "type": "keyword"
              }
            }
          }
        }
      }
    }
  }
}

Ответы [ 2 ]

1 голос
/ 12 января 2020

Вы пропустили minimum_should_match параметр, проверьте это: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html.
Я думаю, ваш запрос должен выглядеть следующим образом:

{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              {
                "wildcard": {
                  "hostName": "*abc*"
                }
              },
              {
                "range": {
                  "requestDate": {
                    "gte": "2019-10-01T08:00:00.000Z"
                  }
                }
              }
            ],
            "minimum_should_match" : 2
          }
        }
      ]
    }
  }
}

Из документации:

Вы можете использовать параметр Minim_should_match, чтобы указать количество или процент предложений must, которые должны совпадать с возвращаемыми документами.

Если в запросе bool есть хотя бы одно предложение must и нет предложений must или filter, значение по умолчанию равно 1. В противном случае значение по умолчанию равно 0.

0 голосов
/ 13 января 2020

В соответствии с вашими сопоставлениями вы должны вызвать полное свойство для полей hostName и requestDate. Пример:

"wildcard": {    
  "index-data-type.hostName": {
    "value": "..."
  }
}

Кроме того, можно также рассмотреть возможность сокращения ваших составных запросов до основного bool запроса с использованием предложения must и применения фильтра. Пример:

{
  "from": 0, 
  "size": 20, 
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "index-data-type.hostName": {
              "value": "*abc*"
            }
          }
        }
      ],
      "filter": {
        "range": {
          "index-data-type.requestDate": {
            "gte": "2019-10-01T08:00:00.000Z"
          }
        }
      }
    }
  }
}

Контекст фильтра не влияет на _score, но уменьшает число hits.

Warnining : Использование звездочки (*) в запросе с подстановочными знаками может серьезно повлиять на производительность ваших запросов.

...