如何将*文本字段的排序添加到ElasticSearch查询

时间:2019-06-21 16:12:37

标签: c# .net json elasticsearch nest

注意:找到了答案,有关更多信息,请参见本文结尾和评论。

ElasticSearch(版本6)是我的k石。我一直在尝试将排序添加到查询中的时间过长,并且仅在响应中得到错误:

  • 没有映射
  • 默认情况下,在文本字段上禁用字段数据。设置fielddata = true ...
    • 当我尝试设置“ fielddata = true”时...出现更多错误
    • [field_sort]未知字段[fielddata],找不到解析器

我尝试过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
                                }
                            ]
                        }
                    }
                ]
            }
        }
    }
}

我需要对结果中的descriptionsalesVolume进行排序。

我们还有另一个查询进行排序,因此我对该查询使用了相同的代码,但是遇到了以上错误。该代码按如下方式构建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属性。重做索引后,我便可以无错误地应用排序顺序。

0 个答案:

没有答案