我目前正在运行带有弹性搜索后端的haystack,现在我正在为城市名称构建自动完成功能.问题是SearchQuerySet给了我不同的结果,从我的角度来看是错误的,而不是直接在elasticsearch中执行的相同查询,这对我来说是预期的结果.
我正在使用:Django 1.5.4,django-haystack 2.1.0,pyelasticsearch 0.6.1,elasticsearch 0.90.3
使用以下示例数据:
使用其中之一
SearchQuerySet().models(Geoname).filter(name_auto='mid')
or
SearchQuerySet().models(Geoname).autocomplete(name_auto='mid')
Run Code Online (Sandbox Code Playgroud)
结果总是返回所有6个名称,包括Min*和Mia*...但是,查询elasticsearch会直接返回正确的数据:
"query": {
"filtered" : {
"query" : {
"match_all": {}
},
"filter" : {
"term": {"name_auto": "mid"}
}
}
}
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 1,
"hits": [
{
"_index": "haystack",
"_type": "modelresult",
"_id": "csi.geoname.4075977",
"_score": 1,
"_source": {
"name_auto": "Midfield",
}
},
{
"_index": "haystack",
"_type": "modelresult", …Run Code Online (Sandbox Code Playgroud) 将我的Django从1.7更新到1.9后,基于Haystack和Solr的搜索引擎停止工作.这就是我得到的:
./manage.py shell
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from haystack.query import SearchQuerySet
>>> sqs = SearchQuerySet().all()
>>>sqs[0].pk
u'1'
>>> sqs[0].text
u'\u06a9\u0627\u0645\u0631\u0627\u0646 \u0647\u0645\u062a\u200c\u067e\u0648\u0631 \u0648 \u0641\u0631\u0647\u0627\u062f \u0628\u0627\u062f\u067e\u0627\nKamran Hematpour & Farhad Badpa'
>>> sqs[0].model_name
u'artist'
>>> sqs[0].id
u'mediainfo.artist.1'
>>> sqs[0].object
Model could not be found for SearchResult '<SearchResult: mediainfo.artist (pk=u'1')>'.
Run Code Online (Sandbox Code Playgroud)
我不得不说我的数据库不是真的,我的配置如下:
HAYSTACK_CONNECTIONS ={
'default': {
'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
'URL': 'http://ahangsolr:8983/solr',
},
}
Run Code Online (Sandbox Code Playgroud)
这是我的search_indexes.py:
import datetime …Run Code Online (Sandbox Code Playgroud) 有没有人有使用任何经验django-haystack与whoosh后端?
我希望将它用于分类的实时搜索类型工具.在生产环境中是否足够快/高效以避免设置solr或xapian?
我正在构建一个需要良好搜索功能的Django项目
其中哪些搜索引擎可以与django haystack一起使用
我需要的另一个建议是,我更喜欢上面还是使用django-elasticsearch?
我一直在使用Django Haystack一段时间,这太棒了!我有一个相当沉重的网站,数据需要不时更新(15到30分钟).
使用时python manage.py update_index,需要花费大量时间来更新数据.有没有办法加快速度?或者,如果可能,可能只更新已更改的数
我目前正在使用Django Haystack 1.2.7和Solr作为后端和Django 1.4.
谢谢!!!
编辑:
是的我已经尝试阅读文档的这一部分,但我真正需要的是一种加速索引的方法.也许只更新最近的数据而不是更新所有数据.我发现get_updated_field但不知道如何使用它.在文档中,它只提到了它的使用原因,但没有显示真实的例子.
编辑2:
start = DateTimeField(model_attr='start', null=True, faceted=True, --HERE?--)
Run Code Online (Sandbox Code Playgroud)
编辑3:
好吧我已经实现了解决方案,但当我尝试rebuild_index(45000数据)时,它几乎崩溃了我的电脑.等待10分钟后出现错误:
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 382, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 196, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 232, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/rebuild_index.py", line 16, in handle
call_command('update_index', **options)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 150, in call_command
return klass.execute(*args, …Run Code Online (Sandbox Code Playgroud) 我正在使用带有Solr后端的Haystack将搜索添加到现有的Django站点.我希望我的搜索能够在几个不同的模型中工作,并返回一组结果.
在迭代结果时,我想根据它的模型类型格式化每个结果 - 例如,如果结果是Apple,使用一个结果模板,但如果它是橙色,则使用不同的模板.
到目前为止,我只是使用示例搜索模板的略微修改版本.在模板中,结果来自page.object_list:
{% if page.object_list %}
<ul>
{% for result in page.object_list %}
<li>
{% if (isinstance(result.object, Apple)) %}
Apple: {{ result.object.titlefield_for_apple }}
{% else %}
Orange: {{ result.object.otherfield_for_orange }}
{% endif %}
</li>
{% endfor %}
</ul>
{% else %}
<p>No results found.</p>
{% endif %}
Run Code Online (Sandbox Code Playgroud)
这不起作用,显然是因为模板内部没有isinstance().那么,我如何根据对象的Model类型控制模板逻辑呢?我可以在模板中使用另一个函数来执行相同的操作吗?
我想我可以测试object(if result.object.otherfield_for_orange)的各个字段来识别它,但这看起来不够优雅.我打赌这可以通过自定义模板标签来完成,但我没有经验.
我正在和Django一起使用Haystack和Whoosh
在search_index.py中我有这个
class PageIndex(RealTimeSearchIndex):
text = CharField(document=True, use_template=True)
creator = CharField(model_attr='creator')
created = DateTimeField(model_attr='created')
org = CharField(model_attr='organisation')
site.register(Page, PageIndex)
Run Code Online (Sandbox Code Playgroud)
我的模板看起来像这样
{{ object.name }}
{{ object.description }}
{{ object.template|striptags }}
{% for k,v in object.get_variables.items %}
{{ v }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
如果我使用更新的名称或描述保存页面,则会立即更新并包含模板中get_variables.items的变量.但是,如果我只更新变量,那么它不会更新.
是因为变量是与它相关的另一个对象,即使我在同一页面上保存它也不会对页面进行更改吗?如果是这样,当我更新相关对象时,如何强制更新页面项?
我有可以属于一个或多个组织模型实例的事件模型实例.我已经实现了haystack 2.0.0来索引我的所有事件.这是一个示例搜索索引.
class EventIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
organization_slug = indexes.CharField(model_attr='organization__slug',
weight=5.0)
organization_name = indexes.CharField(model_attr='organization__name',
weight=5.0)
name = indexes.CharField(model_attr='name', weight=10.0)
....
def get_model(self):
return Event
def index_queryset(self):
return Event.objects.filter()
Run Code Online (Sandbox Code Playgroud)
我的问题是如何构建一个基于一个或多个组织过滤事件的SearchQuerySet查询. 例如,我想查找属于"orgnization1"和"organization3"的所有事件(其中组织列表可以是任意长度)
作为Django查询,它可能看起来像这样:
Event.objects.filter(organization__in=[orgnization1, organization3]).filter(...)
Run Code Online (Sandbox Code Playgroud)
如何将其转换为haystack查询?这是我的尝试,但我真的不知道我在做什么......
organization_list = [organization1.slug, organization2.slug]
SearchQuerySet().filter_or(organization__contains=organization_list)
Run Code Online (Sandbox Code Playgroud)
以下是我的模型外观的示例:
class Event(models.Model):
name = models.CharField(max_length=64)
organization = models.ForeignKey('mymodule.Organization')
...
class Organization(models.Model):
slug = models.SlugField(max_length=64)
name = models.CharField(max_length=64)
...
Run Code Online (Sandbox Code Playgroud)
任何帮助深表感谢.
即使未插入搜索查询,我也希望显示与所选方面匹配的所有结果.与某些商店应用程序的工作方式类似,例如Amazon
e.g. Show all products which are "blue" and between $10-$100.
如果未指定搜索查询,Haystack不会返回任何值.
我有什么想法可以解决它吗?
谢谢!
我有一些看起来如下的JSON:让我们调用该字段元数据
{
"somekey1": "val1",
"someotherkey2": "val2",
"more_data": {
"contains_more": [
{
"foo": "val5",
"bar": "val6"
},
{
"foo": "val66",
"baz": "val44"
},
],
"even_more": {
"foz" : 1234,
}
}
}
Run Code Online (Sandbox Code Playgroud)
这只是一个简单的例子.真正的人可以变得更加复杂.钥匙可以多次出现.值也可以是int或str.
现在第一个问题是我不太确定如何在elasticsearch中对此进行正确索引,以便我可以找到具有特定请求的内容.
我正在使用Django/Haystack,索引如下所示:
class FooIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
metadata = indexes.CharField(model_attr='get_metadata')
# and some more specific fields
Run Code Online (Sandbox Code Playgroud)
和模板:
{
"foo": {{ object.foo }},
"metadata": {{ object.metadata}},
# and some more
}
Run Code Online (Sandbox Code Playgroud)
然后将使用上面的示例填充元数据,结果将如下所示:
{
"foo": "someValue",
"metadata": {
"somekey1": "val1",
"someotherkey2": "val2",
"more_data": {
"contains_more": [
{ …Run Code Online (Sandbox Code Playgroud)