Django-Haystack 文本字段 returns 空行“\n\n”
Django-Haystack text field returns blank lines "\n\n"
我正在尝试使用 django-haystack(2.6.0) 和 solr(4.10.4) 来实现两个字段搜索。我想通过 ship
名称或船舶 country
(returns 来自给定国家/地区的船舶列表)搜索我的模型,但是如果我用 [= 定义一个字段,我会遇到问题24=] 我没有得到任何结果。
我休假了 documentation and this ,它看起来相当简单。
我创建了以下 search_indexes.py
:
class ShipListIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return ShipList
def index_queryset(self, using=None):
return self.get_model().objects.all()
我在我的应用程序中创建了一个新模板,用于指定要在搜索中使用的所有字段:
search/indexes/myapp/shiplist_text.txt
{{ objects.ship }}
{{ objects.country }}
这是我的模型:
class ShipList(models.Model):
ship = models.CharField(max_length=200)
country = models.CharField(max_length=200)
region = models.CharField(max_length=250, blank=True)
city = models.CharField(max_length=250, blank=True)
ship_class = models.CharField(max_length=200, blank=True)
ship_type = models.CharField(max_length=200, blank=True)
remarks = models.CharField(max_length=200, blank=True)
url = models.URLField(max_length=200)
slug = models.SlugField()
和视图:
def ship_search(request):
results = None
cd = None
form = SearchForm()
if 'query' in request.GET:
form = SearchForm(request.GET)
if form.is_valid():
cd = form.cleaned_data
results = SearchQuerySet().models(ShipList).filter(content=cd['query']).load_all()
return render(request,
'core/draft/search.html',
{'form': form,
'results': results,
'cd': cd})
简单模板
{% block search %}
{% if "query" in request.GET %}
{% for result in results %}
{% with ship=result.object %}
<p>{{ ship.ship }}</p>
<p><a href="{{ ship.get_absolute_url }}">{{ ship.ship }}</a></p>
{% endwith %}
{% empty %}
<p>There are no results for your query.</p>
{% endfor %}
{% else %}
<h1>Search for posts</h1>
<form action="." method="get">
{{ form.as_p }}
<input type="submit" value="Search">
</form>
{% endif %}
{% endblock %}
然后我检查了 solr 接口 http://127.0.0.1:8983/solr/#/myapp/query
以获得 JSON 响应:
{
"responseHeader": {
"status": 0,
"QTime": 2
},
"response": {
"numFound": 11,
"start": 0,
"docs": [
{
"django_ct": "core.shiplist",
"id": "core.shiplist.1",
"django_id": "1",
"text": "\n\n"
},
{
"django_ct": "core.shiplist",
"id": "core.shiplist.2",
"django_id": "2",
"text": "\n\n"
},
{
"django_ct": "core.shiplist",
"id": "core.shiplist.3",
"django_id": "3",
"text": "\n\n"
]
}
}
这是搜索索引中为每艘船存储的数据
我发现文本字段包含 "\n\n
我猜这是问题所在,也许它应该是这样的:
"text": "USS Arizona\nUnited States"
到目前为止,我已经尝试在没有 use_template
的情况下创建 search_indexs.py:
class ShipListIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, model_attr='ship')
def get_model(self):
return ShipList
它工作正常,我可以按船名搜索并且查询输出是正确的。
{
"id": "core.shiplist.5",
"django_ct": "core.shiplist",
"django_id": "5",
"text": "USS Arizona"
},
最后是我的 solrconfig.xml
<?xml version="1.0" encoding="utf-8" ?>
<config>
<luceneMatchVersion>LUCENE_36</luceneMatchVersion>
<requestHandler name="/select" class="solr.StandardRequestHandler"
default="true" />
<requestHandler name="/update" class="solr.UpdateRequestHandler" />
<requestHandler name="/admin" class="solr.admin.AdminHandlers" />
<requestHandler name="/admin/ping" class="solr.PingRequestHandler">
<lst name="invariants">
<str name="qt">search</str>
<str name="q">*:*</str>
</lst>
</requestHandler>
</config>
显然我遗漏了什么或者我不明白它是如何工作的?
在您的模板中搜索字段的构成方式:
search/indexes/myapp/shiplist_text.txt
{{ objects.ship }}
{{ objects.country }}
.. 你引用的是 objects
(末尾有一个 s)。正确的名称是 object
,没有多余的 s
:
{{ object.ship }}
{{ object.country }}
您看到的额外的 \n 是文件末尾的换行符。不保存它,您也将避免在值的末尾有一个额外的 \n 。不过,这对可搜索性并不重要。
我正在尝试使用 django-haystack(2.6.0) 和 solr(4.10.4) 来实现两个字段搜索。我想通过 ship
名称或船舶 country
(returns 来自给定国家/地区的船舶列表)搜索我的模型,但是如果我用 [= 定义一个字段,我会遇到问题24=] 我没有得到任何结果。
我休假了 documentation and this
我创建了以下 search_indexes.py
:
class ShipListIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return ShipList
def index_queryset(self, using=None):
return self.get_model().objects.all()
我在我的应用程序中创建了一个新模板,用于指定要在搜索中使用的所有字段:
search/indexes/myapp/shiplist_text.txt
{{ objects.ship }}
{{ objects.country }}
这是我的模型:
class ShipList(models.Model):
ship = models.CharField(max_length=200)
country = models.CharField(max_length=200)
region = models.CharField(max_length=250, blank=True)
city = models.CharField(max_length=250, blank=True)
ship_class = models.CharField(max_length=200, blank=True)
ship_type = models.CharField(max_length=200, blank=True)
remarks = models.CharField(max_length=200, blank=True)
url = models.URLField(max_length=200)
slug = models.SlugField()
和视图:
def ship_search(request):
results = None
cd = None
form = SearchForm()
if 'query' in request.GET:
form = SearchForm(request.GET)
if form.is_valid():
cd = form.cleaned_data
results = SearchQuerySet().models(ShipList).filter(content=cd['query']).load_all()
return render(request,
'core/draft/search.html',
{'form': form,
'results': results,
'cd': cd})
简单模板
{% block search %}
{% if "query" in request.GET %}
{% for result in results %}
{% with ship=result.object %}
<p>{{ ship.ship }}</p>
<p><a href="{{ ship.get_absolute_url }}">{{ ship.ship }}</a></p>
{% endwith %}
{% empty %}
<p>There are no results for your query.</p>
{% endfor %}
{% else %}
<h1>Search for posts</h1>
<form action="." method="get">
{{ form.as_p }}
<input type="submit" value="Search">
</form>
{% endif %}
{% endblock %}
然后我检查了 solr 接口 http://127.0.0.1:8983/solr/#/myapp/query
以获得 JSON 响应:
{
"responseHeader": {
"status": 0,
"QTime": 2
},
"response": {
"numFound": 11,
"start": 0,
"docs": [
{
"django_ct": "core.shiplist",
"id": "core.shiplist.1",
"django_id": "1",
"text": "\n\n"
},
{
"django_ct": "core.shiplist",
"id": "core.shiplist.2",
"django_id": "2",
"text": "\n\n"
},
{
"django_ct": "core.shiplist",
"id": "core.shiplist.3",
"django_id": "3",
"text": "\n\n"
]
}
}
这是搜索索引中为每艘船存储的数据
我发现文本字段包含 "\n\n
我猜这是问题所在,也许它应该是这样的:
"text": "USS Arizona\nUnited States"
到目前为止,我已经尝试在没有 use_template
的情况下创建 search_indexs.py:
class ShipListIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, model_attr='ship')
def get_model(self):
return ShipList
它工作正常,我可以按船名搜索并且查询输出是正确的。
{
"id": "core.shiplist.5",
"django_ct": "core.shiplist",
"django_id": "5",
"text": "USS Arizona"
},
最后是我的 solrconfig.xml
<?xml version="1.0" encoding="utf-8" ?>
<config>
<luceneMatchVersion>LUCENE_36</luceneMatchVersion>
<requestHandler name="/select" class="solr.StandardRequestHandler"
default="true" />
<requestHandler name="/update" class="solr.UpdateRequestHandler" />
<requestHandler name="/admin" class="solr.admin.AdminHandlers" />
<requestHandler name="/admin/ping" class="solr.PingRequestHandler">
<lst name="invariants">
<str name="qt">search</str>
<str name="q">*:*</str>
</lst>
</requestHandler>
</config>
显然我遗漏了什么或者我不明白它是如何工作的?
在您的模板中搜索字段的构成方式:
search/indexes/myapp/shiplist_text.txt
{{ objects.ship }}
{{ objects.country }}
.. 你引用的是 objects
(末尾有一个 s)。正确的名称是 object
,没有多余的 s
:
{{ object.ship }}
{{ object.country }}
您看到的额外的 \n 是文件末尾的换行符。不保存它,您也将避免在值的末尾有一个额外的 \n 。不过,这对可搜索性并不重要。