注意:找到了答案,有关更多信息,请参见本文结尾和评论。
ElasticSearch(版本6)是我的k石。我一直在尝试将排序添加到查询中的时间过长,并且仅在响应中得到错误:
我尝试过ingore_unmapped
并收到相同的“未知字段”错误。
ES文档太通用了,以至于无济于事,因此SO上的任何内容都无济于事...我在遇到各种错误后已经看过/阅读过
所以现在...
这是我当前通过邮递员使用的查询。我在C#项目中使用Nest来构建它。我知道如何在Postman中正确获取json结构来构建查询:
{
"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
属性。重做索引后,我便可以无错误地应用排序顺序。