我在使用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构建正确的查询以获得基于我上面提到的条件的结果吗?
RAW QUERY:
{
"query":{
"bool":{
"must":[
{
"match":{
"studio":{
"query":"StackOverflow studio"
}
}
},
{
"filtered":{
"filter":{
"exists":{
"field":"member"
}
}
}
},
{
"more_like_this":{
"fields":[
"firstName",
"lastName",
"emailAddress"
],
"like_text":"John"
}
}
]
}
}
}
更新1:
我已经修改了第3个查询(存在('成员'))。事实证明,我忘了将client
和member
放在config.yml
的映射下。仍然是第二次查询失败。
答案 0 :(得分:1)
由于没有答案,我会回答自己。 我没有使用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);