2017-07-25 201 views
0

我正在研究一个需要从elsaticsearch获取数据的应用程序。 在前端,其实我想用爱可信的要求去做:用axios向Elasticsearch发送请求

const query = { 
    query: { 
    match: { 
     "_id": "AV12n5KzsohD5gXzTnOr" 
    } 
    } 
}; 

axios.get('http://localhost:9200/my-index/my-type/_search', query) 
    .then((res) => { 
    console.log(res); 
    }); 

我希望得到一些ID的具体文件。上面的查询实际上在kibana中起作用。但是,上面的查询返回my-type中的所有文档,我在这里做错了什么?

+0

对不起,我更新了帖子,谢谢。 – nicemayi

回答

1

我认为下面应该工作。虽然Axios READMEdata是专门只为PUTPOSTPATCH请求,我没有看到在强制执行此代码的任何,和简化的测试表明,请求主体为GET请求发送确:

axios.get('http://localhost:9200/my-index/my-type/_search', { 
    data: JSON.stringify(query), 
}).then((res) => { 
    console.log(res); 
}); 

编辑

请注意,我只在Node.js的测试此,而不是在一个浏览器。浏览器可能不太倾向于将请求包含请求主体GET

EDIT 2

Elasticsearch似乎让sending the request body in a parameter instead,也许是因为这个非常问题。

这应该做的伎俩:

axios.get('http://localhost:9200/my-index/my-type/_search', { 
    params: { 
    source: JSON.stringify(query), 
    source_content_type: 'application/json' 
    } 
}).then((res) => { 
    console.log(res); 
}); 

编辑3

这确实似乎是在做浏览器中GET请求的一般限制。每个the documentation for XMLHttpRequest.send

如果请求方法是GET或HEAD,则忽略参数并将请求主体设置为空。

+0

谢谢!我尽力用你的方式尝试,但仍然是,我得到了所有文件,而不是我想要的文件。我认为我的get-request不会向elasticsearch发送任何有效载荷,很奇怪...... – nicemayi

+0

请参阅我的第二次编辑。 – smarx

+0

嗨smarx,你的第二个编辑实体工作!嗯..我猜axios是那种不接受非POST请求请求体的库。无论如何,感谢您的帮助:) – nicemayi

0

试试这个

axios.get(`http://localhost:9200/my-index/my-type/_search?q=${_id:AV12n5KzsohD5gXzTnOr}`) 
    .then((res) => { 
    console.log(res); 
}); 
+0

是的,这将工作。但对于更复杂的DSL查询,我认为smarx的第二个编辑应该是最好的解决方案。谢谢! – nicemayi