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

时间:2015-06-18 20:44:45

标签: django django-haystack xapian

我在我的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)

它看起来很笨重而且容易出问题。另外,我无法使用搜索模板。

你是如何处理这个问题的?

1 个答案:

答案 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