Ограничить длину текста столбца в ответеasticsearch - PullRequest
1 голос
/ 28 апреля 2020

Ниже приведено сопоставление эластичного поиска

{
  "metadata" : {
    "mappings" : {
      "properties": {
        "id": {"type":"keyword"},
        "title": {"type":"keyword"},
        "created": {"type":"date"},
        "modified": {"type":"date"},
        "keyword": {"type":"keyword"},
        "description": {"type":"text"}
      }
    }
  }
}

Вот мой запрос ES для получения данных, основанных на запросе пользователя по нескольким полям, ограничению до 5 попаданий, сортировке по дате изменения и отображению только полей заголовка и описания , Запрос работает отлично, как я ожидаю.

GET /_search
{
    "query": {
        "multi_match" : {
            "query" : "UK House Price Index",
            "fields" : ["title", "keyword", "description"]
        }
    },
    "size": 5,
    "_source": ["title", "description"],
    "sort": {"modified": "asc"}
}

Я хотел бы ограничить свой ответ в поле описания максимум 100 символами. Я новичок в ES. Может ли кто-нибудь посоветовать мне, как это сделать эффективно?

1 Ответ

0 голосов
/ 28 апреля 2020

Вы можете использовать highlighting, чтобы получить только соответствующую часть совпадающего description. Он имеет настройку fragment_size, которая, по сути, представляет собой конкатенацию строк, которую вы ищете, и, как ни странно, по умолчанию равна 100.

POST long_desc/_doc
{"title":"UK House Price Index","keyword":"UK House Price Index","description":"APM automatically collects in-depth performance metrics and errors from inside your applications. Ingest logs UK House Price Index from popular data sources and easily visualize in preconfigured dashboards."}
GET long_desc/_search
{
  "query": {
    "multi_match": {
      "query": "UK House Price Index",
      "fields": [
        "title",
        "keyword",
        "description"
      ]
    }
  },
  "size": 5,
  "_source": [
    "title"
  ],
  "sort": {
    "modified": "asc"
  },
  "highlight": {
    "pre_tags": "",
    "post_tags": "",
    "fragment_size": 1,
    "fields": {
      "description": {
        "fragment_size": 100,
        "number_of_fragments": 1,
        "fragmenter": "span"
      }
    }
  }
}

, уступая

[
  {
    "_index":"long_desc",
    "_type":"_doc",
    "_id":"zSWAwnEBPAbzy1R_Uk-I",
    "_score":null,
    "_source":{
      "title":"UK House Price Index"
    },
    "highlight":{
      "description":[
        "Ingest logs UK House Price Index from popular data sources and easily visualize in preconfigured dashboards"
      ]
    }
    ...
  }
]

FYI pre_ & post_tags по умолчанию <em>, поэтому вашему веб-интерфейсу на самом деле не нужно выполнять какую-либо постобработку, чтобы выделить совпадения. Я выбрал пустые строки, чтобы сохранить description в чистоте.

...