实时获取

为了使索引更新可见(可搜索),必须进行某种提交操作,以将搜索器重新打开到索引的新的时间点视图。

实时获取功能允许检索(通过 unique-key)任何文档的最新版本,而无需重新打开搜索器的相关成本。这主要在将 Solr 用作 NoSQL 数据存储而不仅仅是搜索索引时非常有用。

实时获取依赖于更新日志功能,该功能默认启用,可以在 solrconfig.xml 中进行配置

<updateLog>
  <str name="dir">${solr.ulog.dir:}</str>
</updateLog>

可以使用 Solr 中隐式存在的 /get 处理程序执行实时获取请求 - 请参阅 隐式请求处理程序 - 它等效于以下配置

<requestHandler name="/get" class="solr.RealTimeGetHandler">
  <lst name="defaults">
    <str name="omitHeader">true</str>
  </lst>
</requestHandler>

例如,如果您使用 bin/solr start -e techproducts 示例命令启动了 Solr,那么您可以像这样索引一个新文档,而不提交它

curl 'https://127.0.0.1:8983/solr/techproducts/update/json?commitWithin=10000000' \
  -H 'Content-type:application/json' -d '[{"id":"mydoc","name":"realtime-get test!"}]'

如果您搜索此文档,则应该找不到它

https://127.0.0.1:8983/solr/techproducts/query?q=id:mydoc
{"response":
  {"numFound":0,"start":0,"docs":[]}
}

但是,如果您使用 /get 暴露的实时获取处理程序,则可以检索该文档

  • V1 API

  • V2 API

https://127.0.0.1:8983/solr/techproducts/get?id=mydoc
{"doc": {
  "id": "mydoc",
  "name": "realtime-get test!",
  "_version_": 1487137811571146752
  }
}
https://127.0.0.1:8983/api/collections/techproducts/get?id=mydoc
{"doc": {
  "id": "mydoc",
  "name": "realtime-get test!",
  "_version_": 1487137811571146752
  }
}

您还可以通过 ids 参数和逗号分隔的 id 列表,或使用多个 id 参数,一次指定多个文档。如果您指定多个 id 或使用 ids 参数,则响应将模拟正常的查询响应,以便现有客户端更易于解析。

例如

  • V1 API

  • V2 API

https://127.0.0.1:8983/solr/techproducts/get?ids=mydoc,IW-02
https://127.0.0.1:8983/solr/techproducts/get?id=mydoc&id=IW-02
{"response":
  {"numFound":2,"start":0,"docs":
    [ { "id":"mydoc",
        "name":"realtime-get test!",
        "_version_":1487137811571146752},
      {
        "id":"IW-02",
        "name":"iPod & iPod Mini USB 2.0 Cable"
      }
    ]
 }
}
https://127.0.0.1:8983/api/collections/techproducts/get?ids=mydoc,IW-02
https://127.0.0.1:8983/api/collections/techproducts/get?id=mydoc&id=IW-02
{"response":
  {"numFound":2,"start":0,"docs":
    [ { "id":"mydoc",
        "name":"realtime-get test!",
        "_version_":1487137811571146752},
      {
        "id":"IW-02",
        "name":"iPod & iPod Mini USB 2.0 Cable"
      }
    ]
 }
}

实时获取请求还可以与使用 fq 参数 指定的过滤器查询结合使用

  • V1 API

  • V2 API

https://127.0.0.1:8983/solr/techproducts/get?id=mydoc&id=IW-02&fq=name:realtime-get
{"response":
  {"numFound":1,"start":0,"docs":
    [ { "id":"mydoc",
        "name":"realtime-get test!",
        "_version_":1487137811571146752}
    ]
 }
}
https://127.0.0.1:8983/api/collections/techproducts/get?id=mydoc&id=IW-02&fq=name:realtime-get
{"response":
  {"numFound":1,"start":0,"docs":
    [ { "id":"mydoc",
        "name":"realtime-get test!",
        "_version_":1487137811571146752}
    ]
 }
}

如果您正在使用 SolrCloud,请不要禁用 /get 处的实时获取处理程序。这样做会导致任何主节点选举都会导致相关分片中的所有副本进行完全同步。

同样,副本恢复也将始终从主节点获取完整的索引,因为在没有此处理程序的情况下,不可能进行部分同步。