elasticsearch,Php,elasticsearch" /> elasticsearch,Php,elasticsearch" />

Php 弹性搜索精确匹配域

Php 弹性搜索精确匹配域,php,elasticsearch,Php,elasticsearch,我有一个名为url的字段,当我对其进行索引时,该字段被设置为not\u analysisd: 'url' => [ 'type' => 'string', 'index' => 'not_analyzed' ] 以下是我确定索引中是否已存在URL的方法: public function urlExists($index, $type, $url) { $params = [ 'index' => $index, '

我有一个名为
url
的字段,当我对其进行索引时,该字段被设置为
not\u analysisd

'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
                        ]
                    ]
                ]
            ]
        ]
    ];

我的问题是,对于未分析的
字段,两个参数的工作方式是否相同?

第二个查询是正确的方法<代码>术语级查询/过滤器应用于精确匹配。最大的优势是<代码>Elasticsearch
用于此功能,您将在后续调用中获得更快的响应时间

从文件中

使用筛选器排除尽可能多的文档,然后仅查询 剩下的文件

另外,如果您观察输出,您会发现每个文档的
\u分数
都是1,因为分数不应用于过滤器,高亮显示也是如此,但通过匹配查询,您将看到不同的
\u分数
。再次从文件中

请记住,一旦将查询包装为筛选器,它将丢失查询 突出显示和评分等功能,因为它们不是功能 由过滤器支持

您的第一个查询使用
match
,它基本上用于
分析字段
,例如,当您希望Google和Google匹配包含Google的所有文档时(不区分大小写)
将使用匹配查询

希望这有帮助