Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 没有草堆的高效Django全文搜索_Python_Django_Django Haystack - Fatal编程技术网

Python 没有草堆的高效Django全文搜索

Python 没有草堆的高效Django全文搜索,python,django,django-haystack,Python,Django,Django 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.ForeignK

没有草堆的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,实现全文索引以按标题和名称字段进行搜索很简单,但据我所知,在没有特定人员审阅的情况下,无法进行查找论文所需的“左外连接”。

Haystack只是一个包装器,它公开了一些不同的搜索引擎后端:

  • 索尔
  • 弹性搜索
  • 呼呼
  • 夏平
可能还有其他后端以及可用的插件

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

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

通常,在创建搜索索引时,最好像创建无关系数据库时那样考虑文档,并且希望这些文档尽可能扁平

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

另一种可能是在elasticsearch中使用“嵌套文档”

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

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


我使用Haystack+弹性搜索,到目前为止,它运行得非常好。别以为这是小事。如果纸和人之间有关联,你可以很容易地实现你的需求。

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

我发现,事实上并不是所有的情况下,例如部分词(见参考)。根据您的约束条件,您可以轻松地实现自己的。 例如,在ViewSet的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

我最终使用了,它为PostgreSQL的内置全文搜索功能提供了一个简单的Django接口。

我认为我更一般的观点是,我正在进行的搜索类型本质上不适合于Haystack包装的搜索功能类型。索引SQL表可能非常有效地处理左外部联接,在某些情况下甚至可以很好地处理全文搜索。我试过Whoosh(恐怖)、Solr和ElasticSearch,但没有一个能很好地处理这个特定案例。@Cerin你读过我在ElasticSearch中对父/子文档的上述评论吗?