ElasticSearch 5.6中等效的MySql Order By Value



ElasticSearch版本: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"
}
}
}
}
}
}}

在上面的映射中,我可以使用以下查询进行简单的排序(ascdesc):

{
"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"
}
}

最新更新