MySql ElasticSearch 5.6 中等效的按值排序
MySql Order By Value equivalent in ElasticSearch 5.6
弹性搜索版本:5.6
我已经在 ElasticSearch 中导入了 MySQL 数据,并且我已经根据需要将映射添加到弹性搜索中。以下是列 application_status
.
的一个映射
映射:
{
"settings": {
"analysis": {
"analyzer": {
"case_insensitive": {
"type": "custom",
"tokenizer": "keyword",
"filter": ["lowercase"]
}
}
}
},
"mappings": {
"lead": {
"properties": {
"application_status": {
"type": "string",
"analyzer": "case_insensitive",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}}
在上述映射中,我可以使用以下查询进行简单排序(asc
或 desc
):
{
"size": 50,
"from": 0,
"sort": [{
"application_status.keyword": {
"order": "asc"
}
}]}
MySql 相当于
select * from <table_name> order by application_status asc limit 50;
需要帮助解决以下问题:
我有 MySQL 查询,它根据 application_status
:
排序
select * from vLoan_application_grid order by CASE WHEN application_status = "IP_QUAL_REASSI" THEN application_status END desc, CASE WHEN application_status = "IP_COMPLE" THEN application_status END desc, CASE WHEN application_status LIKE "IP_FRESH%" THEN application_status END desc, CASE WHEN application_status LIKE "IP_%" THEN application_status END desc
请帮我在 ElasticSearch 中编写相同的查询。我无法在 ElasticSearch 中找到与 strings
等效的 order by value
。在线搜索,我明白,我应该使用 sorting scripts
但找不到任何合适的文档。
我有以下查询,只进行简单排序。
{
"size": 500,
"from": 0,
"query" : {
"match_all": {}
},
"sort": {
"_script": {
"type": "string",
"script": {
"source": "doc['application_status.keyword'].value",
"params": {
"factor": ["IP_QUAL_REASS", "IP_COMPLE"]
}
},
"order": "desc"
}
}}
在上面的查询中,我没有使用 params
部分,因为我不知道如何将它用于 type: string
我想我要求太多了。请帮助或任何相关文档链接将不胜感激。希望问题很清楚。如有必要,我会提供更多详细信息。
您有两个选择:
- 最高效的方法是在索引时索引另一个应该是数字的字段。这个数字(您的选择)将是该状态的数字表示。然后在搜索时,您只需按该数字而不是按状态排序
- 在搜索时使用一个脚本,该脚本将执行与第一个选项几乎相同的操作,但动态且性能较低(但仍然相当快)
下面你有第二个选项:
"sort": {
"_script": {
"type": "number",
"script": {
"source": "if (params.factor[0].containsKey(doc['application_status.keyword'].value)) return params.factor[0].get(doc['application_status.keyword'].value); else return 1000;",
"params": {
"factor": [{
"IP_QUAL_REASS":1,
"IP_COMPLE":2,
"whatever":3
}
]
}
},
"order": "asc"
}
}
如果您还想要 LIKE WHATEVER%
之类的东西,我的建议是考虑更改索引时间,而不是搜索时间,因为脚本会变得更加复杂。但是,这也适用于通配符匹配:
"sort": {
"_script": {
"type": "number",
"script": {
"source": "if (params.factor[0].containsKey(doc['application_status.keyword'].value)) return params.factor[0].get(doc['application_status.keyword'].value); else { params.wildcard_factors[0].entrySet().stream().filter(kv -> doc['application_status.keyword'].value.startsWith(kv.getKey())).map(Map.Entry::getValue).findFirst().orElse(1000)}",
"params": {
"factor": [
{
"IP_QUAL_REASS": 1,
"IP_COMPLE": 2,
"whatever": 3
}
],
"wildcard_factors": [
{
"REJ_": 66
}
]
}
},
"order": "asc"
}
}
弹性搜索版本:5.6
我已经在 ElasticSearch 中导入了 MySQL 数据,并且我已经根据需要将映射添加到弹性搜索中。以下是列 application_status
.
映射:
{
"settings": {
"analysis": {
"analyzer": {
"case_insensitive": {
"type": "custom",
"tokenizer": "keyword",
"filter": ["lowercase"]
}
}
}
},
"mappings": {
"lead": {
"properties": {
"application_status": {
"type": "string",
"analyzer": "case_insensitive",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}}
在上述映射中,我可以使用以下查询进行简单排序(asc
或 desc
):
{
"size": 50,
"from": 0,
"sort": [{
"application_status.keyword": {
"order": "asc"
}
}]}
MySql 相当于
select * from <table_name> order by application_status asc limit 50;
需要帮助解决以下问题:
我有 MySQL 查询,它根据 application_status
:
select * from vLoan_application_grid order by CASE WHEN application_status = "IP_QUAL_REASSI" THEN application_status END desc, CASE WHEN application_status = "IP_COMPLE" THEN application_status END desc, CASE WHEN application_status LIKE "IP_FRESH%" THEN application_status END desc, CASE WHEN application_status LIKE "IP_%" THEN application_status END desc
请帮我在 ElasticSearch 中编写相同的查询。我无法在 ElasticSearch 中找到与 strings
等效的 order by value
。在线搜索,我明白,我应该使用 sorting scripts
但找不到任何合适的文档。
我有以下查询,只进行简单排序。
{
"size": 500,
"from": 0,
"query" : {
"match_all": {}
},
"sort": {
"_script": {
"type": "string",
"script": {
"source": "doc['application_status.keyword'].value",
"params": {
"factor": ["IP_QUAL_REASS", "IP_COMPLE"]
}
},
"order": "desc"
}
}}
在上面的查询中,我没有使用 params
部分,因为我不知道如何将它用于 type: string
我想我要求太多了。请帮助或任何相关文档链接将不胜感激。希望问题很清楚。如有必要,我会提供更多详细信息。
您有两个选择:
- 最高效的方法是在索引时索引另一个应该是数字的字段。这个数字(您的选择)将是该状态的数字表示。然后在搜索时,您只需按该数字而不是按状态排序
- 在搜索时使用一个脚本,该脚本将执行与第一个选项几乎相同的操作,但动态且性能较低(但仍然相当快)
下面你有第二个选项:
"sort": {
"_script": {
"type": "number",
"script": {
"source": "if (params.factor[0].containsKey(doc['application_status.keyword'].value)) return params.factor[0].get(doc['application_status.keyword'].value); else return 1000;",
"params": {
"factor": [{
"IP_QUAL_REASS":1,
"IP_COMPLE":2,
"whatever":3
}
]
}
},
"order": "asc"
}
}
如果您还想要 LIKE WHATEVER%
之类的东西,我的建议是考虑更改索引时间,而不是搜索时间,因为脚本会变得更加复杂。但是,这也适用于通配符匹配:
"sort": {
"_script": {
"type": "number",
"script": {
"source": "if (params.factor[0].containsKey(doc['application_status.keyword'].value)) return params.factor[0].get(doc['application_status.keyword'].value); else { params.wildcard_factors[0].entrySet().stream().filter(kv -> doc['application_status.keyword'].value.startsWith(kv.getKey())).map(Map.Entry::getValue).findFirst().orElse(1000)}",
"params": {
"factor": [
{
"IP_QUAL_REASS": 1,
"IP_COMPLE": 2,
"whatever": 3
}
],
"wildcard_factors": [
{
"REJ_": 66
}
]
}
},
"order": "asc"
}
}