ПРИМЕЧАНИЕ. Ответ был найден, см. Конец этого поста и комментарии для получения дополнительной информации.
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
.Как только индексирование было переделано, я смог применить порядок сортировки без ошибок.