我在使用Elastica和ruflin库来构建PHP时遇到困难。我没有很多例子可以效仿。
我在Symfony项目中有User
实体,该实体包含以下字段:firstName
,lastName
,emailAddress
,studio
和member
或client
(取决于它是什么用户)
所以现在我想过滤掉一些结果。
$finder = $this->get('fos_elastica.finder.app.user');
$boolQuery = new BoolQuery();
$fieldQuery = new Match();
$fieldQuery->setFieldQuery('studio', 'StackOverflow studio');
$boolQuery->addMust($fieldQuery);
John
的用户:$fieldQuery = new MoreLikeThis();
$fieldQuery->setFields(['firstName', 'lastName', 'emailAddress']);
$fieldQuery->setLikeText('John');
$boolQuery->addMust($fieldQuery);
注意:用户与
Client
和Member
实体有关系。依赖于此,它将显示Member:Object或Client:Object。在这种情况下,我想确保该成员存在。$fieldQuery = new Filtered();
$fieldQuery->setFilter(new Exists('member'));
$boolQuery->addMust($fieldQuery);
$users = $finder->find($boolQuery);
问题是...它不起作用。它显示了0个结果。无论我如何处理,它都会显示0个结果或错误的结果。
有人可以帮我如何使用ruflin库为Elastica建立适当的查询,以便根据上述条件获得结果吗?
原始查询:
{
"query":{
"bool":{
"must":[
{
"match":{
"studio":{
"query":"StackOverflow studio"
}
}
},
{
"filtered":{
"filter":{
"exists":{
"field":"member"
}
}
}
},
{
"more_like_this":{
"fields":[
"firstName",
"lastName",
"emailAddress"
],
"like_text":"John"
}
}
]
}
}
}
更新1:
我已经设法解决第三查询(Exists('member'))。原来,我忘记了将
client
和member
放在config.yml
中的映射下。仍然第二次查询失败。
最佳答案
既然没有答案,我会自己回答。
我没有使用MoreLikeThis查询来查找文本,而是使用QueryString,事情开始起作用
这是整个现在的样子:config.yml
:
fos_elastica:
...
indexes:
app:
types:
user:
mappings:
emailAddress: ~
firstName: ~
lastName: ~
studio: ~
member: ~
client: ~
persistence:
driver: orm
model: AppBundle\Entity\User
provider: ~
listener:
finder: ~
Controller
: $finder = $this->get('fos_elastica.finder.app.user');
$boolQuery = new BoolQuery();
$fieldQuery = new Match();
$fieldQuery->setFieldQuery('studio', 'StackOverflow studio');
$boolQuery->addMust($fieldQuery);
$fieldQuery = new Filtered();
$fieldQuery->setFilter(new Exists('member'));
$boolQuery->addMust($fieldQuery);
$fieldQuery = new QueryString();
$fieldQuery->setFields(['firstName', 'lastName', 'emailAddress']);
$fieldQuery->setQuery('John*'); // * wildcard will filter look a like results for you.
$boolQuery->addMust($fieldQuery);
$query = new Query();
$query->setQuery($boolQuery);
$query->addSort(['firstName' => 'asc']);
$users = $finder->find($query);
关于elasticsearch - 在ruflin Elastic search Symfony3中构建查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39346544/