将 Elastic Search 查询转换为 Elastica
Convert Elastic Search Query to Elastica
我有一个 Elastic Search 查询:
{
"query": {
"bool": {
"must": [
{
"match": {"title": "accountant"}
},
{
"nested": {
"path": "schools",
"query": {
"bool": {
"must": [
{ "match": { "schools.school_name": "Duke University" }}
]
}}}}
]
}}}
我正在使用 php 的 Elastica 库,我想将此原始查询转换为 Elastica。我知道我可以 运行 来自 Elastica 的原始查询,但我更喜欢使用 Elastica 类。我试过了this and this。但其中 none 有效。这是我当前代码的简化版本:
$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);
然而,这 returns 的结果是空的。原始查询有 return 个结果,所以我知道我应该得到一些东西。有人可以帮我吗?谢谢
这是针对您的查询的 1:1 Elastica 翻译:
$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()));
您粘贴的 Elasticsearch 查询不包含过滤器,仅包含查询。因此,Elastica 翻译不应使用 \Elastica\Filter
中的对象,而应使用 \Elastica\Query
中的对象。此外,如果您想在 Elasticsearch 中使用之前验证查询,您可以使用 $query->toArray()
.
打印它
这是 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'
))
)
)
);
我有一个 Elastic Search 查询:
{
"query": {
"bool": {
"must": [
{
"match": {"title": "accountant"}
},
{
"nested": {
"path": "schools",
"query": {
"bool": {
"must": [
{ "match": { "schools.school_name": "Duke University" }}
]
}}}}
]
}}}
我正在使用 php 的 Elastica 库,我想将此原始查询转换为 Elastica。我知道我可以 运行 来自 Elastica 的原始查询,但我更喜欢使用 Elastica 类。我试过了this and this。但其中 none 有效。这是我当前代码的简化版本:
$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);
然而,这 returns 的结果是空的。原始查询有 return 个结果,所以我知道我应该得到一些东西。有人可以帮我吗?谢谢
这是针对您的查询的 1:1 Elastica 翻译:
$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()));
您粘贴的 Elasticsearch 查询不包含过滤器,仅包含查询。因此,Elastica 翻译不应使用 \Elastica\Filter
中的对象,而应使用 \Elastica\Query
中的对象。此外,如果您想在 Elasticsearch 中使用之前验证查询,您可以使用 $query->toArray()
.
这是 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'
))
)
)
);