我正在尝试编写一个查询来搜索名为category1
和category2
的两列上的产品。我正在使用弹性搜索php客户端并尝试匹配应查询但由于子串的匹配这给了我错误的结果。
但我正在寻找与两列的OR操作完全匹配。我是新手,请指导我。
$params['index'] = 'furnit';
$params['type'] = 'products';
$params['body']['query']['bool']['should'] = array(
array('match' => array('category1' => $category->name)),
array('match' => array('category2' => $category->name)),
);
$results = $this->elasticsearch->search($params);
答案 0 :(得分:0)
如果您没有搜索,那么在此场景中使用bool查询不是在elasticsearch中执行此操作的正确方法。当您搜索某些内容并且搜索关键字的相关性和匹配文档的得分很重要时,将使用查询。
在这里,您可以应用elasticsearch的bool过滤器来过滤掉所需的结果。使用带有查询的过滤器(过滤查询)是正确的方法,因为它排除了所有不匹配的文档,然后您可以使用匹配查询搜索所需的文档。
这是一个bool过滤器的例子
{
"from": 0,
"size": 50,
"sort": [
{
"name" : {
"order": "asc"
}
}
],
"query": {
"filtered": {
"query": {
"match_all" : {}
},
"filter": {
"bool": {
"should": [
{
"term": {
"category1" : "category1"
}
},
{
"term": {
"category2" : "category2"
}
}
]
}
}
}
}
}
您也可以参考文档(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-filter.html)
答案 1 :(得分:0)
也许您的问题是您使用的是默认分析仪(标准分析仪)。 你能给我你的地图吗? 我建议你在索引时改为使用not_analyzer并使用术语过滤/查询。
您可以在此处使用put mapping来设置分析器:Put Mapping
编辑:我为你创建了一个要点,请在此处查看: