为什么不能与Solr工作联系?

时间:2015-08-25 17:19:21

标签: python apache solr scrapy pipeline

我正在使用Scrapy抓取网站,然后将该数据发送到Solr进行索引。数据通过使用Solr的Python客户端之一 - mysolr的项目管道发送。

蜘蛛正常工作,我的items数组有两个具有正确字段的项目。该数组由管道中的process_item函数调用。

项目管道

from mysolr import Solr

class SolrPipeline(object):
    def __init__(self):
        self.client = Solr('http://localhost:8983/solr', version=4)
        response = self.client.search(q='Title')
        print response

    def process_item(self, item, spider):
        docs = [
            {'title' : item["title"],
             'subtitle' : item["subtitle"]   
            },
            {'title': item["title"],
             'subtitle': item["subtitle"]
            }
        ]
        print docs
        self.client.update(docs, 'json', commit=False)
        self.client.commit()

这是我遇到问题的地方。打印的响应是< SolrResponse状态= 404>。我使用了每当我启动Solr管理UI时出现的SOLR_URL。

我得到的另一个错误如下。

2015-08-25 09:06:53 [urllib3.connectionpool] INFO: Starting new HTTP connection (1): localhost
2015-08-25 09:06:53 [urllib3.connectionpool] DEBUG: Setting read timeout to None
2015-08-25 09:06:53 [urllib3.connectionpool] DEBUG: "POST /update/json HTTP/1.1" 404 1278
2015-08-25 09:06:53 [urllib3.connectionpool] INFO: Starting new HTTP connection (1): localhost
2015-08-25 09:06:53 [urllib3.connectionpool] DEBUG: Setting read timeout to None
2015-08-25 09:06:53 [urllib3.connectionpool] DEBUG: "POST /update HTTP/1.1" 404 1273

六行出现两次(我试图添加的每个项目一次,我认为)。

1 个答案:

答案 0 :(得分:1)

您希望使用JSON数据执行POST请求,但实际上将Python字典列表传递给self.client.update()方法。

将Python词典列表转换为JSON:

import json
from mysolr import Solr

class SolrPipeline(object):
    def __init__(self):
        self.client = Solr('http://localhost:8983/solr', version=4)
        response = self.client.search(q='Title')
        print response

    def process_item(self, item, spider):
        docs = [
            {'title' : item["title"],
             'subtitle' : item["subtitle"]   
            },
            {'title': item["title"],
             'subtitle': item["subtitle"]
            }
        ]

        docs = json.dumps(docs)  # convert to JSON
        self.client.update(docs, 'json', commit=False)
        self.client.commit()