Elasticsearch完全匹配字段

时间:2016-01-03 12:59:33

标签: php elasticsearch

我有一个名为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的工作方式是否相同?

1 个答案:

答案 0 :(得分:1)

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

来自文档

  

使用过滤器排除尽可能多的文档,然后只查询   剩下的文件。

此外,如果您观察输出结果,您会发现每个文档的_score 1 ,因为评分未应用于过滤器,同样适用于突出显示但是匹配查询您会看到不同的_score。再次来自文档

  

请记住,一旦将查询包装为过滤器,它就会丢失查询   突出显示和评分等功能,因为这些不是功能   过滤器支持。

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

希望这会有所帮助!!