刚开始学习solr。我正在尝试使用solrpy作为客户端。我的python代码是:
import solr
# create a connection to a solr server
s = solr.SolrConnection('http://localhost:8983/solr')
# add a document to the index
doc = dict(
id='testid123',
title='Lucene in Action',
author=['Erik Hatcher', 'Otis Gospodneti'],
)
s.add(doc, commit=True)
# do a search
response = s.query('title:lucene')
for hit in response.results:
print hit['title']
这是来自给定here
的示例我的solr schema.xml是solr发行版附带的默认架构。我没有对此做出任何改变。它有一个uniqueKey字段作为" id"。
<uniqueKey>id</uniqueKey>
它是字符串类型
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
当我运行我的代码时,在我的客户端仍然出现错误:
Traceback (most recent call last):
File "/Users/user1/Documents/workspace/PyDelight/src/Test.py", line 12, in <module>
s.add(doc, commit=True)
File "/Library/Python/2.7/site-packages/solrpy-0.9.5-py2.7.egg/solr/core.py", line 678, in add
return Solr.add_many(self, [fields], commit=_commit)
File "/Library/Python/2.7/site-packages/solrpy-0.9.5-py2.7.egg/solr/core.py", line 326, in wrapper
return self._update(content, query)
File "/Library/Python/2.7/site-packages/solrpy-0.9.5-py2.7.egg/solr/core.py", line 550, in _update
rsp = self._post(selector, request, self.xmlheaders)
File "/Library/Python/2.7/site-packages/solrpy-0.9.5-py2.7.egg/solr/core.py", line 639, in _post
return check_response_status(self.conn.getresponse())
File "/Library/Python/2.7/site-packages/solrpy-0.9.5-py2.7.egg/solr/core.py", line 1097, in check_response_status
raise ex
solr.core.SolrException: HTTP code=400, reason=Bad Request
在solr trace一侧,我得到错误:
843169 [qtp1151734776-20] INFO org.apache.solr.update.processor.LogUpdateProcessor ? [collection1] webapp=/solr path=/update params={commit=true} {} 0 0
843170 [qtp1151734776-20] ERROR org.apache.solr.core.SolrCore ? org.apache.solr.common.SolrException: Document is missing mandatory uniqueKey field: id
schema.xml文件位于solr-4.4.0 / example / solr / collection1 / conf
中我只是在示例目录中运行start.jar来运行solr。
知道我哪里错了吗?
答案 0 :(得分:3)
我没有使用过很多solrpy(还没有安装它)但是从最初的例子来看,它看起来好像要用attribute = value对而不是字典来调用。 (我知道您发布的示例是正确的在线0.9.2文档!但github上的当前源代码在评论中有这一点):
add(**params)
Add a document. Pass in all document fields as
keyword parameters:
add(id='foo', notes='bar')
You must "commit" for the addition to be saved.
所以试试这个:
s.add(commit=True, **doc)
它可能会奏效。您可能需要提取并单独执行,我不知道。
我不是solr专家,只是玩了一下,但我使用sunburnt比使用solrpy更好运。也许值得一试。
编辑:指向该文件的github指针位于:http://code.google.com/p/solrpy/source/browse/solr/core.py
答案 1 :(得分:0)
我没有使用Solr所以我可能完全错了,但在示例中,您链接到id
是int
。尝试将您的int
改为'testid123'
,将您的ID从123
更改为{{1}}之类的内容,看看会发生什么。