我有一个名为url
的字段,当我将其编入索引时,该字段设置为not_analyzed
:
'url' => [
'type' => 'string',
'index' => 'not_analyzed'
]
以下是确定索引中是否已存在URL的方法:
public function urlExists($index, $type, $url) {
$params = [
'index' => $index,
'type' => $type,
'body' => [
'query' => [
'match' => [
'url' => $url
]
]
]
];
$results = $this->client->count($params);
return ($results['count'] > 0);
}
这似乎工作正常,但我不能100%确定这是找到完全匹配的正确方法,因为阅读文档的另一种搜索方式是使用以下参数:
$params = [
'index' => $index,
'type' => $type,
'body' => [
'query' => [
'filtered' => [
'filter' => [
'term' => [
'url' => $url
]
]
]
]
]
];
我的问题是,对于not_analyzed
字段,params的工作方式是否相同?
答案 0 :(得分:1)
第二个查询是正确的方法。 term level queries/filters
应该用于完全匹配。最大的优势是caching。 Elasticsearch
使用bitset进行此操作,随后的调用您将获得更快的响应时间。
来自文档
使用过滤器排除尽可能多的文档,然后只查询 剩下的文件。
此外,如果您观察输出结果,您会发现每个文档的_score
1 ,因为评分未应用于过滤器,同样适用于突出显示但是匹配查询您会看到不同的_score
。再次来自文档
请记住,一旦将查询包装为过滤器,它就会丢失查询 突出显示和评分等功能,因为这些不是功能 过滤器支持。
您的第一个查询使用的match
基本上用于analyzed fields
,例如当您希望 Google 和 google 匹配所有包含的文档时match queries
。
希望这会有所帮助!!