标签: django-haystack

Django haystack EdgeNgramField给出了与弹性搜索不同的结果

我目前正在运行带有弹性搜索后端的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)

python django django-haystack elasticsearch

13
推荐指数
2
解决办法
3973
查看次数

Haystack说"无法找到SearchResult的模型"

将我的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)

python django solr nginx django-haystack

13
推荐指数
1
解决办法
1008
查看次数

Django干草堆和飞快移动

有没有人有使用任何经验django-haystack与whoosh后端?

我希望将它用于分类的实时搜索类型工具.在生产环境中是否足够快/高效以避免设置solr或xapian?

django search whoosh django-haystack

12
推荐指数
2
解决办法
6064
查看次数

django haystack:哪个搜索引擎会更好

我正在构建一个需要良好搜索功能的Django项目

其中哪些搜索引擎可以与django haystack一起使用

  • Solr的
  • elasticsearch
  • Xapian的

我需要的另一个建议是,我更喜欢上面还是使用django-elasticsearch?

django search-engine django-haystack

12
推荐指数
1
解决办法
4379
查看次数

Django Haystack更新指数更快

我一直在使用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)

django solr django-haystack

12
推荐指数
1
解决办法
5117
查看次数

干草堆搜索结果:如何在page.object_list中为不同的模型使用不同的模板?

我正在使用带有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 django-templates django-haystack

11
推荐指数
1
解决办法
3740
查看次数

Haystack - 为什么RealtimeSearchIndex有时不会更新我保存的对象

我正在和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的变量.但是,如果我只更新变量,那么它不会更新.

是因为变量是与它相关的另一个对象,即使我在同一页面上保存它也不会对页面进行更改吗?如果是这样,当我更新相关对象时,如何强制更新页面项?

django-haystack

11
推荐指数
3
解决办法
3741
查看次数

Django Haystack:根据列表中的多个项目过滤查询.

我有可以属于一个或多个组织模型实例的事件模型实例.我已经实现了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)

任何帮助深表感谢.

django search django-queryset relation django-haystack

11
推荐指数
1
解决办法
5657
查看次数

Django Haystack - 显示结果而不需要搜索查询?

即使未插入搜索查询,我也希望显示与所选方面匹配的所有结果.与某些商店应用程序的工作方式类似,例如Amazon

e.g. Show all products which are "blue" and between $10-$100.

如果未指定搜索查询,Haystack不会返回任何值.

我有什么想法可以解决它吗?

谢谢!

python django search solr django-haystack

10
推荐指数
3
解决办法
4782
查看次数

索引/搜索elasticsearch中的"复杂"JSON

我有一些看起来如下的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)

python django json django-haystack elasticsearch

10
推荐指数
1
解决办法
2041
查看次数