Эластичный поиск: Как извлечь все «имена полей», которые соответствуют фразе / строке запроса - PullRequest
0 голосов
/ 27 марта 2019

Я хочу извлечь имена полей, в которых текст поиска появляется в индексированных документах эластичного поиска (сохраненных).

Возможен ли этот тип запросов в упругом поиске, я использую Nest Client в C #

Пожалуйста, обратитесь к примеру ниже:

Пример: документ сотрудника { "first_name": "emp first", "last_name": "emp last" }

Введите текст для поиска: "first" Ожидается: ["first_name"]

Введите текст для поиска: "emp" Ожидаемый результат: ["first_name", "last_name"]

Спасибо, AT

1 Ответ

1 голос
/ 27 марта 2019

В эластичном поиске есть функция «Именованные запросы» , каждый запрос можно назвать по имени, а эластичный поиск выдаст имена соответствующих запросов

Для вашего случая вы можете использовать этот запрос

GET index/doc_type/_search
{
  "_source": [
    "first_name",
    "last_name"
  ],
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "first_name": {
              "query": "emp",
              "_name": "first_name"
            }
          }
        },
        {
          "match": {
            "last_name": {
              "query": "emp",
              "_name": "last_name"
            }
          }
        }
      ]
    }
  }
}

Elasticsearch выдаст такой же результат, как этот

{
  "took": 90,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 16.399673,
    "hits": [
      {
        "_index": "index",
        "_type": "doc_type",
        "_id": "1",
        "_score": 16.399673,
        "_routing": "1",
        "_source": {
          "first_name": "emp first",
          "last_name": "emp last"
        },
        "matched_queries": [
          "first_name",
          "last_name"
        ]
      }
    ]
  }
}

Вы также можете сделать то же самое с выделением

GET index/doc_type/_search
{
  "_source": [
    "first_name",
    "last_name"
  ],
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "first_name": "emp"
          }
        },
        {
          "match": {
            "last_name": "emp"
          }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "first_name": {},
      "last_name" : {}
    }
  }
}

Пример ответа:

{
  "took": 90,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 16.399673,
    "hits": [
      {
        "_index": "index",
        "_type": "doc_type",
        "_id": "1",
        "_score": 16.399673,
        "_routing": "1",
        "_source": {
          "first_name": "emp first",
          "last_name": "emp last"
        },
        "highlight": [
          "first_name" : ["<em>emp</em> first"],
          "last_name" : ["<em>emp</em> last"]
        ]
      }
    ]
  }
}
...