如何配置 Django-haystack 以便 "content" 搜索仍然在搜索字段中显示结果
How to config Django-haystack so "content" searched still shows results in the search field
我正在使用 django-haystack-solr 和 ajax。当客户在搜索字段中键入内容时,匹配的结果会显示在下拉框中。事情是 solr 也搜索我的内容。因此,如果客户输入 pasta primavera 及其内容而不是标题,则不会显示任何结果。如何使 post 标题显示,即使查询在内容中?需要明确的是,如果我输入 pasta primavera 而它不是 post.title,而是 post 的 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()
我的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})
我的post_text.txt
{{ object.title }}
{{ object.content }}
我的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>
欢迎大家指导
在自动完成搜索期间搜索的字段是使用您的这行代码配置的:
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
这对我有用
sqs = SearchQuerySet()
sqs1 = sqs.autocomplete(title_auto=query).order_by('-publish')
sqs2 = sqs.autocomplete(content_auto=query).order_by('-publish')
posts = sqs1 | sqs2
我正在使用 django-haystack-solr 和 ajax。当客户在搜索字段中键入内容时,匹配的结果会显示在下拉框中。事情是 solr 也搜索我的内容。因此,如果客户输入 pasta primavera 及其内容而不是标题,则不会显示任何结果。如何使 post 标题显示,即使查询在内容中?需要明确的是,如果我输入 pasta primavera 而它不是 post.title,而是 post 的 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()
我的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})
我的post_text.txt
{{ object.title }}
{{ object.content }}
我的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>
欢迎大家指导
在自动完成搜索期间搜索的字段是使用您的这行代码配置的:
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
这对我有用
sqs = SearchQuerySet()
sqs1 = sqs.autocomplete(title_auto=query).order_by('-publish')
sqs2 = sqs.autocomplete(content_auto=query).order_by('-publish')
posts = sqs1 | sqs2