gpt4 book ai didi

elasticsearch - elasticsearch 7以及映射和排序

转载 作者:行者123 更新时间:2023-12-03 00:48:24 25 4
gpt4 key购买 nike

我很难在ES 7中实现排序。我似乎总是收到Fielddata is disabled on text fields by default. Set fielddata=true on ...我还创建了一个映射,在其中打开了字段数据,但是以某种方式,它没有带来任何变化。

{
"index": "orderoverview",
"body": {
"mappings": {
"properties": {
"CUSTREFNR": {
"type": "text",
"fielddata": true
},
"ORDERNR_EVO": {
"type": "text",
"fielddata": true
},
}
}
}
}


我必须说,我对清除ES 7中的类型并不十分清楚。
通过索引,我必须提供一种类型:
'index' => getIndexName(),
'type' => 'Orderoverview',
'body' => []

在这里,如果提供我的类型,则会出现错误: Rejecting mapping update to [index] as the final mapping would have more than 1 type: [_doc, Orderoverview]"}]
因此,我使用_doc类型为它们建立了索引,但是搜索不再起作用。
"index": "orderoverview",
"type": "_doc",
"body": {
"from": 0,
"size": 20,
"query": {
"bool": {
"should": [
{
"term": {
"CUSTNR": "24508"
}
}
]
}
}
}
}


ES很棒,但有时感觉就像是黑魔法。

最佳答案

对现有字段进行任何修改,始终建议删除索引并再次重新添加文档。当您添加新字段时,情况可能并非如此,尽管@Amit在注释中提到过。

另一点是,最好使用keyword字段,而不是像link中提到的那样将文本字段的fielddata设置为true。

其次,在您的问题中,您在映射中指定了不同的字段(CUSTREFNR,ORDERNR_EVO),并且正在查询不同的字段(CUSTNR)。确保您注意到一些小事情。

以下是示例映射,文档,查询请求和响应。

对应:

创建multi-field而不是启用fielddata=true。您可以在提到的链接中阅读有关它们的信息。以下是您的映射方式:

PUT orderoverview
{
"mappings": {
"properties": {
"CUSTREFNR": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"ORDERNR_EVO": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}

注意,对于这两个字段,我最终都创建了其同级 keyword字段。

您可以在相应的链接中了解 textkeyword数据类型。

仅作说明,请使用 keyword进行聚合和排序功能,并使用 text进行典型搜索。

同样,当涉及完全匹配时,请使用 Term Query来利用 keyword

另外,您不应该在ES 7中的映射中指定类型。通过 this链接,我们有以下注意事项:

Specifying types in requests is deprecated. For instance, indexing a document no longer requires a document type. The new index APIs are PUT {index}/_doc/{id} in case of explicit ids and POST {index}/_doc for auto-generated ids. Note that in 7.0, _doc is a permanent part of the path, and represents the endpoint name rather than the document type.



这意味着,在摄取期间唯一可接受的值为 _doc。除此之外,您的摄取都会失败。

样本文件:
POST orderoverview/_doc/1
{
"CUSTREFNR": "24508",
"ORDERNR_EVO": "A1B1"
}

POST orderoverview/_doc/2
{
"CUSTREFNR": "24508",
"ORDERNR_EVO": "A1B2"
}

POST orderoverview/_doc/3
{
"CUSTREFNR": "24508",
"ORDERNR_EVO": "A2B2"
}

POST orderoverview/_doc/4
{
"CUSTREFNR": "24509",
"ORDERNR_EVO": "A1B1"
}

查询样例:

假设您有一个用例,想要选择所有具有24508作为 CUSTREFNR的文档,但是您想按 ORDERNR_EVO对其进行排序,那么查询方式如下:
POST orderoverview/_search
{
"query": {
"match": {
"CUSTREFNR": "24508"
}
},
"sort": [
{
"ORDERNR_EVO.keyword": {
"order": "desc"
}
}
]
}

响应:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "orderoverview",
"_type" : "_doc",
"_id" : "3",
"_score" : null,
"_source" : {
"CUSTREFNR" : "24508",
"ORDERNR_EVO" : "A2B2"
},
"sort" : [
"A2B2"
]
},
{
"_index" : "orderoverview",
"_type" : "_doc",
"_id" : "2",
"_score" : null,
"_source" : {
"CUSTREFNR" : "24508",
"ORDERNR_EVO" : "A1B2"
},
"sort" : [
"A1B2"
]
},
{
"_index" : "orderoverview",
"_type" : "_doc",
"_id" : "1",
"_score" : null,
"_source" : {
"CUSTREFNR" : "24508",
"ORDERNR_EVO" : "A1B1"
},
"sort" : [
"A1B1"
]
}
]
}
}

希望这可以帮助!

关于elasticsearch - elasticsearch 7以及映射和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57163699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com