如何配置Django-haystack以及#34;内容"搜索仍会在搜索字段中显示结果

时间:2016-02-29 14:26:39

标签: python django solr django-haystack

我正在使用django-haystack-solr和ajax。当客户在搜索字段中键入时,结果会在下拉框中显示匹配。事情是solr也搜索我的内容。因此,如果客户输入pasta primavera及其内容而非标题,则不会显示任何结果。即使查询在内容中,如何使帖子标题显示?要清楚的是,如果我输入的是pasta primavera而不是post.title,但是在帖子的post.content中,我仍然希望显示post.title。获得此结果的正确语法是什么?以下是我的代码

我的search_index.py

class PostIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='title')
        content = indexes.CharField(model_attr='content')
        publish = indexes.DateTimeField(model_attr='publish')
        slug = indexes.CharField(model_attr='slug')

        content_auto = indexes.EdgeNgramField(model_attr='title')

        def get_model(self):
            return Post

        def index_queryset(self, using=None):
            """Used when the entire index for model is updated."""
            return self.get_model().objects.all()

my views.py

def search_title(request):
posts = SearchQuerySet().autocomplete(content_auto=request.GET.get('search_text', '')).order_by('-publish')
context = {
    "posts": posts
}
# context.update(csrf(request))
return render(request, "posts/ajax_search.html", {"posts": posts})

my post_text.txt

{{ object.title }}
{{ object.content }}

my ajax_search.html

{% if posts.count > 0 %}
<div class="result-box" id="cell">
{% for post in posts %}

<li><a href="{% url 'posts:detail' post.slug %}" id="fix" class="list-group-item">{{ post.title }}</a></li>
{% endfor %}

{% else %}
<li class="list-group-item" id="none"> None to show</li>

{% endif %}
</div>

欢迎所有指导

2 个答案:

答案 0 :(得分:0)

在自动填充搜索期间搜索的字段使用以下代码行进行配置:

content_auto = indexes.EdgeNgramField(model_attr='title')

我还没有使用haystack类(总是在SOLR端配置我自己的处理程序),但我认为你只需要配置两个字段:

title_auto = indexes.EdgeNgramField(model_attr='title')
content_auto = indexes.EdgeNgramField(model_attr='content')

在查询中添加其他字段:

query = request.GET.get('search_text', None)
if query:
    # updated according to losee's comment
    sqs1 = sqs.autocomplete(title_auto=query).order_by('-publish')
    sqs2 = sqs.autocomplete(content_auto=query).order_by('-publish')

    posts = sqs1 | sqs2

SearchQuerySet.autocomplete()源代码: https://github.com/django-haystack/django-haystack/blob/master/haystack/query.py#L448

注意:您必须将新字段添加到SOLR架构中。

SOLR唯一解决方案

如果您对SOLR足够熟悉,可采用另一种方法:

您的solr架构中已有字段content_auto。将以下内容添加到您的架构中:

<copyField source="content" dest="content_auto" />

重新索引。然后你当前的代码应该工作。 https://cwiki.apache.org/confluence/display/solr/Copying+Fields

答案 1 :(得分:0)

这对我有用

sqs = SearchQuerySet()
  sqs1 = sqs.autocomplete(title_auto=query).order_by('-publish')
  sqs2 = sqs.autocomplete(content_auto=query).order_by('-publish')

  posts = sqs1 | sqs2