1

弹性搜索版本: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中找到order by value等价物。strings在网上搜索,我明白,我应该使用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

我相信我要求太多了。请帮助或任何相关的文档链接将不胜感激。希望问题很清楚。如有必要,我会提供更多详细信息。

4

1 回答 1

2

你有两个选择:

  • 最高效的方法是在索引时索引另一个应该是数字的字段。这个数字(您的选择)将是该状态的数字表示。然后在搜索时,您只需按该数字而不是状态排序
  • 在搜索时使用与第一个选项几乎相同的脚本,但动态且性能较低(但仍然相当快)

下面你有第二个选项:

  "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"
    }
  }
于 2017-11-02T07:18:02.770 回答