Elasticsearch无痛脚本查询循环

时间:2018-03-09 17:28:52

标签: java python elasticsearch lucene elasticsearch-painless

我们目前正在构建一个基于elasticsearch的搜索工具,我们的查询涉及将最近的值与用户输入值进行匹配。 假设用户输入[1,10,100,1000,10000]它应该将索引中可用的最接近的值返回到数组中的每个元素。

现在我们正在使用以下查询一次检索一个值,并且我们通过循环传递用户输入数组并且它非常慢。

{
    "query": {
        "term": {"CHR": "chr1"}
    },
    "sort" : {
        "_script" : {
            "type" : "number",
            "script" : {
                "lang": "painless",
                "params": {
              "factor": 10000
            },
                "inline": "def cur = 0; cur = (params.factor - doc['START'].value); if (cur < 0) { cur = cur * -1 } else { cur = cur}" },
            "order" : "asc"
        }
    }

}

我们的要求是该因子将采用整数数组而不是单个值,并给出我们在索引中找到的第一个最接近的值。

完整的python函数发布在下面(Python)

def gene_peek(coordinate, chr):
peek_liver = []
for i in range(0,len(coordinate)):
    a = int(coordinate[i])
    res = requests.post("http://localhost:9200/lab/peek_liver/_search?pretty=true&scroll=10m&size=1", json={
    "query": {
        "term": {"CHR": chr[i]}
    },
    "sort" : {
        "_script" : {
            "type" : "number",
            "script" : {
                "lang": "painless",
                "params": {
              "factor": a
            },
                "inline": "def cur = 0; cur = (params.factor - doc['START'].value); if (cur < 0) { cur = cur * -1 } else { cur = cur}" },
            "order" : "asc"
        }
    }

})
    data = res.json()
    peek_liver.append(data["hits"]["hits"][0]["_source"])
return peek_liver

非常感谢任何帮助。 感谢。

0 个答案:

没有答案