2

没有 Haystack 的 Django 与数据库无关的全文搜索的下一个最佳选择是什么?

我有一个模型:

class Paper(models.Model):
    title = models.CharField(max_length=1000)

class Person(models.Model):
    name = models.CharField(max_length=100)

class PaperReview(models.Model):
    paper = models.ForeignKey(Paper)
    person = models.ForeignKey(Person)

我需要按标题和审稿人姓名搜索论文,但我也想从一个人的角度搜索,找到他们有哪些论文,哪些没有审过。使用 Haystack,实现全文索引以按标题和名称字段搜索是微不足道的,但据我所知,没有特定人员的审查,没有办法执行查找论文所需的“左外连接” .

4

4 回答 4

1

Haystack 只是一个包装器,它暴露了几个不同的搜索引擎后端:

  • 索尔
  • 弹性搜索
  • 嗖嗖
  • 夏必安

可能还有其他后端以及插件可用。

所以这里真正的问题是,是否有一个搜索后端可以为我提供所需的功能,以及 haystack 是否公开了该功能?

答案是,您可能可以使用 elasticsearch*,但请注意 asterix。

通常,在创建搜索索引时,最好以与创建无关系数据库相同的方式考虑文档,并且希望这些文档尽可能平坦。

因此,一种可能性可能是在 paperreview 索引上有一个 char 字段数组。该数组将包含所有相关的外键引用。

另一个可能是在弹性搜索中使用“嵌套文档”。

最后,在 elasticsearch 中使用“父/子文档”。

您仍然可以使用 haystack 进行索引,并进行一些黑客攻击,但您可能希望直接使用原始后端之一,例如 pyelasticsearch 或 pyes。

于 2013-05-28T14:51:52.713 回答
1

我知道这个问题比较老,但我最近花了一些时间调查这个问题并在这里回答了这个问题,但实际上自己实现这个问题并不太难,并想分享。

我发现SearchVector/SearchQuery 方法实际上并不能捕获所有情况,例如部分单词(参见https://www.fusionbox.com/blog/detail/partial-word-search-with-postgres-full-text-search- in-django/632/供参考)。根据您的限制,您可以轻松实现自己的。例如,在视图集的 get_queryset 方法中:

    ...other params...

            search_terms = self.request.GET.get('q')
            if search_terms:
                # remove possible other delimiters and other chars
                # that could interfere
                cleaned_terms = re.sub(r'[!\'()|&;,]', ' ', search_terms).strip()
                if cleaned_terms:
                    # Check against all the params we want
                    # apply to previous terms' filtered results
                    q = reduce(
                        lambda p, n: p & n,
                        map(
                            lambda word:
                                Q(your_property__icontains=word) | Q(
                                    second_property__icontains=word) | Q(
                                    third_property__icontains=word)
                            cleaned_terms.split()
                        )
                    )
                    qs = YourModel.objects.filter(q)
           return qs
于 2018-03-13T01:16:12.523 回答
0

我使用 Haystack + 弹性搜索,到目前为止它工作得很好。不要认为它微不足道。如果纸张和人之间存在关联,您可以轻松实现您的要求。

于 2013-06-24T16:53:47.863 回答
0

我最终使用了djorm-ext-pgfulltext,它为 PostgreSQL 的内置全文搜索功能提供了一个简单的 Django 界面。

于 2018-03-13T12:32:44.993 回答