Как добавить сортировку для текстового поля * в ElasticSearch Query - PullRequest
0 голосов
/ 21 июня 2019

ПРИМЕЧАНИЕ. Ответ был найден, см. Конец этого поста и комментарии для получения дополнительной информации.

ElasticSearch (ver 6) - мой криптонит.Я пытался добавить сортировку к запросу слишком долго и получал только ошибки в ответе:

  • Нет сопоставления
  • По умолчанию текстовые поля отключены для текстовых полей.Установите fielddata = true ...
    • , когда я пытаюсь установить "fielddata = true" ... Я получаю больше ошибок
    • [field_sort] неизвестное поле [fielddata], парсер не найден

Я попытался ingore_unmapped и получил ту же ошибку "неизвестного поля".

Документация ES настолько универсальна, что она бесполезна, и ничто здесь в SO не помогло ... Я посмотрел / прочитал после того, как наткнулся на различные ошибки

Так что теперь ...

Вот мой текущий запрос, который я использую через Почтальон.Я использую Nest в своем проекте C #, чтобы создать это.Я знаю, как создавать запросы, если я могу получить структуру json прямо в Postman:

{
  "from": 0,
  "size": 50,
  "aggs": {
    "specs": {
      "nested": {
        "path": "specs"
      },
      "aggs": {
        "names": {
          "terms": {
            "field": "specs.name",
            "size": 10
          },
          "aggs": {
            "specValues": {
              "terms": {
                "field": "specs.value",
                "size": 10
              }
            }
          }
        }
      }
    }
  },
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "Id": {
                  "value": 1
                }
              }
            }
          ],
          "must_not": [
            {
              "terms": {
                "partId": []
              }
            }
          ],
          "should": [
            {
              "terms": {
                "picCode": [
                  "b02"
                ]
              }
            },
            {
              "terms": {
                "partId": []
              }
            }
          ]
        }
      }
    }
  }
}

Результаты, которые я получаю, выглядят так:

{
    "took": 13,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 281,
        "max_score": 1,
        "hits": [
            {
                "_index": "09812734",
                "_type": "part",
                "_id": "1234:1",
                "_score": 1,
                "_source": {
                    "id": "1234:1",
                    "partId": 1234,
                    "mcfCostCenterId": 1,
                    "oemCode": "ABC",
                    "oemDescription": "Blah blah blah",
                    "oemPartCode": "123456",
                    "picCode": "B02",
                    "description": "other blah blah",
                    "isServiceable": false,
                    "marketingDescription": "this thing does stuff"",
                    "salesVolume": 0,
                    "searchSortOrder": 0,
                    "catalogSortOrders": [],
                    "specs": [
                        {
                            "name": "Color",
                            "value": "NA"
                        },
                        {
                            "name": "Diameter",
                            "value": "7.0000"
                        },
                        {
                            "name": "OtherSpec",
                            "value": "Q"
                        },
                        {
                            "name": "LastSpec",
                            "value": "FuBar"
                        }
                    ]
                }
            }
        ]
    },
    "aggregations": {
        "specs": {
            "doc_count": 18,
            "names": {
                "doc_count_error_upper_bound": 0,
                "sum_other_doc_count": 0,
                "buckets": [
                    {
                        "key": "Length",
                        "doc_count": 4,
                        "specValues": {
                            "doc_count_error_upper_bound": 0,
                            "sum_other_doc_count": 0,
                            "buckets": [
                                {
                                    "key": "2",
                                    "doc_count": 1
                                },
                                {
                                    "key": "3",
                                    "doc_count": 1
                                },
                                {
                                    "key": "8",
                                    "doc_count": 1
                                }
                            ]
                        }
                    }
                ]
            }
        }
    }
}

Мне нужно отсортировать по description или salesVolume в результатах.

У нас есть другой запрос, который выполняет сортировку, поэтому я использовал тот же код для этого запроса, но получил вышеуказанные ошибки.Этот код создает JSON следующим образом:

{
  "from": 0,
  "size": 50,
  "sort": [
    {
      "foo.bar": {
        "missing": "_last",
        "order": "desc",
        "nested_filter": {
          "term": {
            "foo.bar": {
              "value": "frankenstein"
            }
          }
        },
        "nested_path": "_source"
      }
    }
  ],
  "aggs": {
    "specs": {
      "nested": {
        "path": "specs"
...

Когда я пытаюсь отредактировать его, чтобы он соответствовал этому поиску, я просто получаю ошибки и никаких результатов.

РЕДАКТИРОВАТЬ: Итак,получить «salesVolume» довольно легко, потому что это не текстовое поле.

{
  "from": 0,
  "size": 50,
  "sort": [
    {
      "salesVolume": {
        "missing": "_last",
        "order": "desc"
      }
    }
  ],
  "aggs": {
  ...

Это устанавливает порядок сортировки без проблем.Итак, суть в тексте ... Я просто не могу понять, где установить fielddata в true без ошибок.

РЕДАКТИРОВАТЬ 2: В моем DTO у меня уже есть поле, настроенное с атрибутом keyword.

public class MyClass
{
    public string Id
    [Text]
    public string ThisCode
    [Keyword]
    public string MySortableTextField
    ... //and so forth
}

Поиск все равно не будет выполнен и с ошибками.

ОТВЕТ: ^^^ Атрибут Keyword сработал.Я не помещал это в правильный проект.У нас есть проект, который строит все наши индексы БД и который все еще использует атрибут Text.Как только индексирование было переделано, я смог применить порядок сортировки без ошибок.

...