gpt4 book ai didi

php - Elasticsearch完全匹配字段

转载 作者:行者123 更新时间:2023-12-02 23:33:01 27 4
gpt4 key购买 nike

我有一个称为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);
}

这似乎很好用,但是我不能百分百确定这是找到完全匹配项的正确方法,因为阅读文档的另一种方法是使用以下参数进行搜索:
    $params = [
'index' => $index,
'type' => $type,
'body' => [
'query' => [
'filtered' => [
'filter' => [
'term' => [
'url' => $url
]
]
]
]
]
];

我的问题是,对于 not_analyzed字段,两种参数的工作方式是否相同?

最佳答案

第二个查询是正确的方法。 term level queries/filters应该用于完全匹配。最大的优势是cachingElasticsearch为此使用bitset,您将在后续调用中获得更快的响应时间。

来自文档

Exclude as many document as you can with a filter, then query just the documents that remain.



同样,如果观察输出,您会发现每个文档的 _score 1 ,因为计分未应用于过滤器,高亮显示也是如此,但是在匹配查询中,您会看到不同的 _score。再次从文档

Keep in mind that once you wrap a query as a filter, it loses query features like highlighting and scoring because these are not features supported by filters.



您的第一个查询使用了 match,它基本上用于 analyzed fields,例如,当您希望Google和google都匹配所有包含google(不区分大小写) match queries的文档时。

希望这可以帮助!!

关于php - Elasticsearch完全匹配字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34576793/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com