超过245个字符长度的Xapian搜索项:InvalidArgumentError:项太长(> 245)

问题描述 投票:4回答:1

我在Django应用中使用Xapian和Haystack。我有一个模型,其中包含我要索引以进行搜索的文本字段。此字段用于存储各种字符:单词,URL,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)

似乎只是笨拙,容易出现问题。另外,我无法使用搜索模板。

您如何处理此问题?

django django-haystack xapian
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.