我在我的django应用程序中使用Xapian和Haystack。我有一个模型,其中包含我要索引搜索的文本字段。该字段用于存储各种字符:单词,网址,html等。
我使用默认的基于文档的索引模板:
text = indexes.CharField(document=True, use_template=True)
当某人粘贴了特别长的链接时,有时会产生以下错误:
InvalidArgumentError: Term too long (> 245)
现在我明白了这个错误。在其他情况下,我之前已经把它带到了其他领域。
我的问题是,处理此异常的首选方法是什么?
似乎处理此异常需要我使用prepare_text()方法:
def prepare_text(self, obj):
content = []
for word in obj.body.split(' '):
if len(word) <= 245:
content += [word]
return ' '.join(content)
它看起来很笨重而且容易出问题。另外,我无法使用搜索模板。
你是如何处理这个问题的?
答案 0 :(得分:0)
我认为您做对了。受xapian omega项目启发,inkscape xapian_backend前叉上有一个补丁。
我已经完成了与您在项目中所做的一样的操作,并使用了一些技巧来使用搜索索引模板:
# regex to efficiently truncate with re.sub
_max_length = 240
_regex = re.compile(r"([^\s]{{{}}})([^\s]+)".format(_max_length))
def prepare_text(self, object):
# this is for using the template mechanics
field = self.fields["text"]
text = self.prepared_data[field.index_fieldname]
encoding = "utf8"
encoded = text.encode(encoding)
prepared = re.sub(_regex, r"\1", encoded, re.UNICODE)
if len(prepared) != len(encoded):
return prepared.decode(encoding, 'ignore')
return text