[英]Convert Elastic Search Query to Elastica
I have an Elastic Search query as: 我有一个弹性搜索查询:
{
"query": {
"bool": {
"must": [
{
"match": {"title": "accountant"}
},
{
"nested": {
"path": "schools",
"query": {
"bool": {
"must": [
{ "match": { "schools.school_name": "Duke University" }}
]
}}}}
]
}}}
I'm using Elastica library of php and I want to convert this raw query into Elastica. 我正在使用php的Elastica库,我想将这个原始查询转换为Elastica。 I know I can run raw query from Elastica, but I would prefer using Elastica classes.
我知道我可以从Elastica运行原始查询,但我更喜欢使用Elastica类。 I have tried this and this .
我试过这个和这个 。 But none of them works.
但它们都不起作用。 Here is the simplified version of my current code:
这是我当前代码的简化版本:
$schoolsTermFilter = new \Elastica\Filter\Term(['schools.school_name' => "Duke University"]);
$schoolsBoolFilter = new \Elastica\Filter\Bool();
$schoolsBoolFilter->addMust($schoolsTermFilter);
$nestedFilter = new \Elastica\Filter\Nested();
$nestedFilter->setPath("schools");
$nestedFilter->setFilter($schoolsBoolFilter);
$boolFilter = new \Elastica\Filter\Bool();
$boolFilter->addMust($nestedFilter);
$query->setPostFilter($boolFilter);
However, this returns empty results. 但是,这会返回空结果。 The raw query does return results, so I know I should get something.
原始查询确实返回结果,所以我知道我应该得到一些东西。 Can anybody help me in this?
有人可以帮助我吗? Thanks
谢谢
This is the QueryBuilder version (>= v1.4.2.0): 这是QueryBuilder版本(> = v1.4.2.0):
$qb = new \Elastica\QueryBuilder();
$query = new \Elastica\Query(
$qb->query()->bool()
->addMust($qb->query()->match(
'title',
'accountant'
))
->addMust($qb->query()->nested()
->setPath('schools')
->setQuery(
$qb->query()->bool()
->addMust($qb->query()->match(
'schools.school_name',
'Duke University'
))
)
)
);
Here is a 1:1 translation to Elastica for your query: 以下是Elastica的1:1翻译供您查询:
$query = new \Elastica\Query();
$matchQuery = new \Elastica\Query\Match();
$matchQuery->setField("title", "accountant");
$schoolsTermQuery = new \Elastica\Query\Match();
$schoolsTermQuery->setField("schools.school_name", "Duke University");
$schoolsBoolQuery = new \Elastica\Query\Bool();
$schoolsBoolQuery->addMust($schoolsTermQuery);
$nestedQuery = new \Elastica\Query\Nested();
$nestedQuery->setPath("schools");
$nestedQuery->setQuery($schoolsBoolQuery);
$boolQuery = new \Elastica\Query\Bool();
$boolQuery->addMust($matchQuery);
$boolQuery->addMust($nestedQuery);
$query->setQuery($boolQuery);
print_r(json_encode($query->toArray()));
The Elasticsearch query which you have pasted does not contain filters, only queries. 您粘贴的Elasticsearch查询不包含过滤器,仅包含查询。 So, the Elastica translation should not use objects from
\\Elastica\\Filter
but from \\Elastica\\Query
instead. 因此,Elastica转换不应使用
\\Elastica\\Filter
对象,而应使用\\Elastica\\Query
。 Also, if you want to verify the query before using it in Elasticsearch, you can print it with $query->toArray()
. 此外,如果要在Elasticsearch中使用它之前验证查询,可以使用
$query->toArray()
进行打印。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.