haystack来解决双重请求和char逃逸

时间:2012-07-12 12:47:27

标签: solr django-haystack

两个问题捆绑在一个问题中:

为什么haystack auto_query向solr发送两个请求并转义:character?

我已经设置了干草堆,因为它是在手册中编写的,一切运行正常,但每当我发送我的solr日志时,我会看到两个请求,如果来自haystack(一个查询)和一个请求,如果来自管理页面:

所以我查询:

title:ong

从Haystack我得到:

Jul 12, 2012 2:37:30 PM org.apache.solr.core.SolrCore execute
INFO: [collection1] webapp=/solr path=/select/ params={spellcheck=true&sort=cand+desc&fl=*+score&start=0&q=(title\:ong)&spellcheck.count=1&spellcheck.collate=true&wt=json&fq=django_ct:(ads.model1+OR+ads.model2+OR+ads.model3)&rows=1} hits=0 status=0 QTime=21
Jul 12, 2012 2:37:30 PM org.apache.solr.core.SolrCore execute
INFO: [collection1] webapp=/solr path=/select/ params={spellcheck=true&sort=cand+desc&fl=*+score&start=0&q=(title\:ong)&spellcheck.count=1&spellcheck.collate=true&wt=json&fq=django_ct:(ads.model1+OR+ads.model2+OR+ads.model3)&rows=0} hits=0 status=0 QTime=23

来自管理部门:

Jul 12, 2012 2:42:35 PM org.apache.solr.core.SolrCore execute
INFO: [collection1] webapp=/solr path=/select params={spellcheck=true&indent=true&q=title:ong&wt=json} hits=2 status=0 QTime=12

haystack请求中存在额外参数,这是可以理解的。

正如您所看到的,q参数是相同的。

几乎一样:任何人都可以告诉为什么haystack auto_query转义:字符并发出两个请求?

我相信,因为:被转义,Solr不会从字段“title”返回“ong”并搜索title \:ong作为字符串,当然它不会返回任何内容。

1 个答案:

答案 0 :(得分:2)

我刚刚发现它为什么逃脱冒号炭。这是因为AutoQuery默认清除它们

class AutoQuery(BaseInput):
....
def prepare(self, query_obj):
....
    for token in tokens:
        if not token:
            continue
        if token in exacts:
            query_bits.append(Exact(token, clean=True).prepare(query_obj))
        elif token.startswith('-') and len(token) > 1:
            # This might break Xapian. Check on this.
            query_bits.append(Not(token[1:]).prepare(query_obj))
        else:
            query_bits.append(Clean(token).prepare(query_obj))

仍在寻找为什么它会发出两个请求......

有史以来的最新编辑:

由于此位

,它会发出两个请求
    if self.results and hasattr(self.results, 'query') and self.results.query.backend.include_spelling:
        context['suggestion'] = self.form.get_suggestion()

在SearchView()。create_response()