【问题标题】:Elasticsearch exact match fieldElasticsearch 精确匹配字段
【发布时间】:2016-01-03 21:44:14
【问题描述】:

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

【问题讨论】:

    标签: php elasticsearch


    【解决方案1】:

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

    来自文档

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

    另外,如果您观察您的输出,您会发现每个文档的_score1,因为评分不适用于过滤器,突出显示也是如此,但使用匹配查询您会看到不同的@ 987654326@。再次来自文档

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

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多