Elasticsearch索引统计信息与搜索命中数不同

时间:2018-05-01 00:17:39

标签: elasticsearch

使用curl 'http://localhost:9200/_cat/indices?v'使用docs.count检查Elasticsearch实例中索引的状态时,每个index中的98160通常大于搜索所有文档时返回的搜索结果数在那个指数上。

有时它是搜索命中的整数倍,但并非总是如此。在一个案例中,索引中的match_all805383文档有CREATE TRIGGER `update_child_users` BEFORE UPDATE ON `abcd_virtuemart_userinfos` FOR EACH ROW BEGIN IF OLD.`primary_user_id` = NEW.`primary_user_id` AND (NEW.`primary_user_id` = 0 OR NEW.`primary_user_id` = '' OR NEW.`primary_user_id` IS NULL) THEN CALL sys.`update_child_user`(NEW.`company`, NEW.`last_name`, NEW.`first_name`, NEW.`middle_name`, NEW.`phone_1`, NEW.`phone_2`, NEW.`fax`, NEW.`address_1`, NEW.`address_2`, NEW.`city`, NEW.`virtuemart_state_id`, NEW.`virtuemart_country_id`, NEW.`zip`, NEW.`billing_email_address`, NEW.`virtuemart_user_id`); END IF; END 次点击。

请注意,映射中没有嵌套文档。

解释是什么?请注意,搜索似乎正常运行。

2 个答案:

答案 0 :(得分:0)

这可能是因为您的数据被分片为多个节点(多节点群集设置)而没有replicas,并且在您执行搜索查询时,其中一个节点可能已关闭。

例如, 如果我只有一个节点的集群,并且该节点有index 4 documents,那么当我检查indices时,我会得到以下输出,

health status index pri rep docs.count docs.deleted store.size pri.store.size 
yellow open   blog    5   1          4            0     10.9kb         10.9kb 

现在,如果我运行match_all查询,

{
    "query": {
        "match_all": {}
    }
}

我会得到,

{
    "took": 3,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 4,
        "max_score": 1,
        "hits": [........

注意docs.count等于hits计数的方式。在上面的输出中,观察分片的数量,即5。所有这些分片都分配给一个节点。

但如果我配置了replicas 而不是的多节点设置,那么这些分片将分布在多个节点中。

假设我有一个双节点群集,其中节点1 节点2 ,共有5个分片,其中5个分片分片0, 1,3 被分配到节点2 ,该节点因维护而关闭或因任何原因无法使用。在这种情况下,您只能通过节点1 获得分片24。现在,如果您尝试检索或搜索数据,会发生什么? Elasticsearch将为您的幸存节点提供搜索结果,即节点1

在这种情况下,点击次数总是小于docs.count值。

使用 replicas

可以避免这种不确定性

答案 1 :(得分:0)

matches all documents, giving them all a _score of 1.0

需要注意的一点是,如果分析了电子邮件字段,则此查询将无法按预期工作,这是Elasticsearch中字段的默认值。在这种情况下,电子邮件字段将分为三个部分:joe,blogs和com。这意味着它将匹配任何三个条款的搜索和文档。  link

how scoring works