【问题标题】:How do you perform a solr sql select * statement?您如何执行 solr sql select * 语句?
【发布时间】:2017-05-12 13:41:47
【问题描述】:

这似乎是一个很简单的问题,但是我google了很久,没有找到任何答案。

具体来说,我在使用 Solr 6.5.0 执行非常简单的 select * sql 查询时遇到了问题。

  • 问:我想达到什么目的?
    • 答:使用 Solr sql 无限选择语句来选择我的集合中具有“property_1”== 100 的所有记录
  • 问:我遇到了什么问题?

    • 答: 执行查询时,我收到一条错误消息“java.io.IOException: score is not a valid field for unlimited queries。”
  • 问:如何防止 solr 自动为我的 sql 查询打分(我不关心分数),这样我就可以执行无限制的 sql 查询并取回我的文档中的所有字段想要吗?

    • 答: ????

当我对集合中的所有文档执行 solr sql 查询时,它会失败,因为 solr 自动在结果中包含一个 score 字段,并且 score 字段不能用于无限的 sql 查询。问题是我的收藏中没有“分数”字段,我没有要求对结果进行评分。从谷歌搜索来看,我似乎默认从 solr 获得一个 score 字段,但我的阅读表明我应该只在我的查询中请求它时才得到这个(我没有这样做)。

我正在使用 Solr 管理 UI 来执行 sql 查询。以下是我得到的确切错误消息:

stmt=select * from TestIndex where property_1 = '100'"

{
  "result-set":{
    "docs":[{
        "EXCEPTION":"Failed to execute sqlQuery 'select * from TestIndex 
where property_1 = '100'' against JDBC connection 'jdbc:calcitesolr:'.\nError 
while executing SQL \"select * from TestIndex where property_1 = '100'\": 
java.io.IOException: score is not a valid field for unlimited queries.",
        "EOF":true,
        "RESPONSE_TIME":172}]}}

现在这里是相同的查询,除了不使用上述查询,我​​将“select *”部分替换为“select FieldA”并获取所有包含“FieldA”的记录。此查询产生以下结果,证明无限制的 sql 选择有效

stmt=select FieldA from TestIndex where property_1 = '100'"

    {
  "result-set":{
    "docs":[{
        "FieldA":["AAAA"]}
      ,{
        "FieldA":["AAAA"]}
      ,{
        "FieldA":["AAAA"]}
      ,{
        "EOF":true,
        "RESPONSE_TIME":247}]}}

问题是我希望返回的所有字段不仅仅是 FieldA,所以上面的查询对我来说毫无用处。此外,这只是一个 POC。在现实世界的用例中,指定 sql 语句中的所有字段是不现实的。我希望 * 能够工作,如果 Solr 没有自动尝试在无限结果中提供分数,它似乎会起作用。因此,执行以下 sql 查询,虽然它可以工作,但在现实世界的场景中是不现实的。

stmt=select FieldA, FieldB, FieldC, FieldD from TestIndex where property_1 = 
'100'

为了让事情变得非常简单,我的测试集合中有 6 个文档。以下是所有文件。我使用了非 sql solr /select 处理程序来让这个结果显示在这里(顺便说一句,我希望能够执行 solr sql select * 以产生与 solr /select *:* 相同的结果,如下所示):

{
    "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":0,
    "params":{
        "q":"*:*",
        "indent":"on",
        "wt":"json",
        "_":"1494587051946"}},
    "response":{"numFound":6,"start":0,"docs":[
    {
        "FieldA":["AAAA"],
        "FieldB":["BBBB"],
        "FieldC":["CCCC"],
        "FieldD":["DDDD"],
        "dateTimestamp":1494591988400,
        "property_1":100,
        "_version_":1567193288840052736},
        {
            "FieldA":["AAAA"],
            "FieldB":["BBBB"],
            "FieldC":["CCCC"],
            "FieldD":["DDDD"],
            "dateTimestamp":1494591988403,
            "property_1":100,
            "_version_":1567193289014116352},
        {
            "FieldA":["AAAA"],
            "FieldB":["BBBB"],
            "FieldC":["CCCC"],
            "FieldD":["DDDD"],
            "dateTimestamp":1494591988404,
            "property_1":100,
            "_version_":1567193289034039296},
        {
            "FieldA":["AAAA"],
            "FieldB":["BBBB"],
            "FieldC":["CCCC"],
            "FieldD":["DDDD"],
            "dateTimestamp":1494591995474,
            "property_1":200,
            "_version_":1567193296256630784},
        {
            "FieldA":["AAAA"],
            "FieldB":["BBBB"],
            "FieldC":["CCCC"],
            "FieldD":["DDDD"],
            "dateTimestamp":1494591995475,
            "property_1":200,
            "_version_":1567193296265019392},
        {
            "FieldA":["AAAA"],
            "FieldB":["BBBB"],
            "FieldC":["CCCC"],
            "FieldD":["DDDD"],
            "dateTimestamp":1494591995476,
            "property_1":200,
            "_version_":1567193296267116544}]
}}

抱歉,帖子太长了。我试图提供所有细节。

有什么想法吗?

【问题讨论】:

    标签: sql solr


    【解决方案1】:

    According to the docs for ParallelSQL(目前是实验性功能):

    表示所有字段的 * 语法在有限或无限查询中均不受支持。

    .. 这似乎表明它与正在计算的分数无关,而只是发出 * 是不可能的。

    我的猜测是 JDBC 驱动程序/SQL 实现需要在返回数据之前知道每列的名称 - 当您询问所有字段时,新的字段名称可以显示在文档排名为 1m - 因此 SQL 接口将遍历结果集两次 - 一次获取所有字段名称,然后一次获取文档(但除非您锁定 DB,否则文档可能会在第二次请求之前更改。 . 这不会是高性能的),或者在读取时将所有内容缓存在内存中.. 这不适用于大型数据集。

    【讨论】:

    • 我确实阅读了您引用的页面,但认为它是旧信息,因为在尝试使用 6.4 版进行查询时,我们正确的请求失败了。对于 6.5,请求被排除在外,如果不是 score 字段,它似乎会被流回。感谢您的回复
    【解决方案2】:

    根据https://issues.apache.org/jira/browse/SOLR-8847,最近添加了对“SELECT *”的支持 但是,它目前仅适用于有限的查询。

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多