loc*_*jay 4 python search whoosh django-haystack
嗨,我使用带有 woosh 的 haystack 作为搜索引擎:
我的模型如下
class Person(models.Model):
personid = models.IntegerField(primary_key = True, db_column = 'PID')
firstname = models.CharField(max_length = 50, db_column = 'FIRSTNAME')
lastname = models.CharField(max_length = 50, db_column = 'LASTNAME')
class Meta:
db_table = '"TEST"."PERSON"'
managed = False
class TDoc(models.Model):
tdocid = models.IntegerField(primary_key = True, db_column = 'TDOCID')
person = models.ForeignKey(Person, db_column = 'PID')
content = models.TextField(db_column = 'CONTENT', blank = True)
filepath = models.TextField(db_column = 'FILEPATH', blank = True)
class Meta:
db_table = '"TEST"."TDOC"'
managed = False
Run Code Online (Sandbox Code Playgroud)
search_index.py 如下:
class TDocIndex(SearchIndex):
content = CharField(model_attr = 'content', document = True)
filepaht = CharField(model_attr = 'filepath')
person = CharField(model_attr = 'person')
def get_queryset(self):
return TDoc.objects.all()
def prepare_person(self, obj):
# Store a list of id's for filtering
return obj.person.lastname
site.register(TDoc, TDocIndex)
Run Code Online (Sandbox Code Playgroud)
我的问题是我想做多个归档搜索,例如
内容:xxx 和人:史密斯
在 haystack 上,它一次搜索所有这些,我无法进行特定的字段搜索。我怀疑我的索引已损坏,但是:
ix = open_dir("/testindex")
searcher = ix.searcher()
mparser = MultifieldParser(["content", "filepath", "person"], schema = ix.schema)
myquery = mparser.parse(content:xxx AND person:SMITH')
results = searcher.search(myquery)
for result in results:
print result
Run Code Online (Sandbox Code Playgroud)
但它有效并返回正确的值。我正在使用教程中的标准 haystack SearchView,search.html
(r'^search/', include('haystack.urls')),
Run Code Online (Sandbox Code Playgroud)
在您的索引中,您应该使用 定义一个字段document=True,它是 haystack 将搜索的文档。按照惯例,这个字段被命名为text。如果您打算对其值进行过滤或排序,则可以添加额外的字段。
执行搜索时考虑多个字段的方法是将文档定义为模板,并use_template在文档字段上进行设置。你的索引看起来像:
class TDocIndex(SearchIndex):
text = CharField(document=True, use_template=True)
#if you plan to filter by person
personid = IntegerField(model_attr='person__id')
site.register(TDoc, TDocIndex)
Run Code Online (Sandbox Code Playgroud)
你会有一个 search/indexes/tdoc_text.txt 模板,比如:
{{ object.content }}
{{ object.filepath }}
{{ object.person.lastname }}
Run Code Online (Sandbox Code Playgroud)
看到这个答案。
| 归档时间: |
|
| 查看次数: |
3488 次 |
| 最近记录: |