Как отфильтровать данные по полю, содержащему указанную c строку в ElasticSearch, Node Js? - PullRequest
1 голос
/ 12 марта 2020

У меня есть простое приложение Node Js.

Я хочу получить отфильтрованные данные по полю Path , которое содержит слово get .

Например, мои данные выглядят следующим образом:

"_source": {
    "time": "2020-03-12T01:25:41.61836-07:00",
    "level": "Info",
    "info": {
      "IpAddress": "0.0.0.0",
      "Path": "/api/test/getTest/1",
      "QueryString": "",
      "UserAgent": "",
      "LogDate": "2020-03-12T08:25:41.6220806Z",
      "Username": "cavidan.aliyev",
      "NodeId": "123456"
    }

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

{
   time,
        level,
        info: {
          IpAddress,
          Path,
          QueryString,
          UserAgent,
          LogDate,
          Username,
          NodeId
        }
}

Мой запрос похож на ниже:

 client.search({
                index: collectionName,
                body: { 
                    from: (params.currentPage - 1) * params.pageSize,
                    size: params.pageSize,
                    "query": {
                        "bool": {
                            "must": mustArr,
                            "filter": [ 
                                {
                                   "match_all": {}
                                }
                            ]
                        }
                    }
                }
            }, function (err, res) {
                if (err) { 
                    reject(err);
                }
                else { 
                    let result = res.hits.hits. map(x => x._source);
                    resolve(result);
                }
            });

Как я могу отфильтровать данные по полю Path , которое содержит слово ' get '?

Пожалуйста, помогите мне, спасибо

Ответы [ 2 ]

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

Если вы не хотите возвращать данные с ключевыми словами «get», ваш шаблон должен вводиться в must_not. Например:

POST <your_index_name>/_search
 {
   "query": {
     "bool": {
       "must_not":{
          "filter": {                       
             "wildcard":{
               "info.Path": "*get*"
              }
           }
        }
     }
  }
}
2 голосов
/ 12 марта 2020

Вы можете использовать Wildcard Query внутри запроса фильтра. Я предполагаю, что вы используете Standard Analyzer для info.Path поля.

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

Если info.Path равно nested, введите:

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "filter": {                        <--- Note this
        "nested": {
          "path": "info",
          "query": {
            "wildcard": {
              "info.Path": {
                "value": "*get*"
              }
            }
          }
        }
      }
    }
  }
}

Если info.Path равно object, введите:

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "filter": {                        <--- Note this
        "wildcard":{
          "info.Path": "*get*"
        }
      }
    }
  }
}

Важное примечание: Поиск с подстановочными знаками замедляет производительность запроса, и если у вас есть элемент управления индексом Elasticsearch, то вам определенно следует взглянуть на ngram модель поиска, которая создает n-gram токены во время индекса, как указано в этой ссылке.

Дайте мне знать, если это поможет!

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