Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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
Django 如何使用Haystack进行局部场匹配?_Django_Search_Search Engine_Django Haystack - Fatal编程技术网

Django 如何使用Haystack进行局部场匹配?

Django 如何使用Haystack进行局部场匹配?,django,search,search-engine,django-haystack,Django,Search,Search Engine,Django Haystack,我需要一个简单的搜索工具来搜索我的django网站,所以我选择了Haystack和Solr。我已经正确设置了所有内容,在键入精确的短语时可以找到正确的搜索结果,但在键入部分短语时无法获得任何结果 例如:“John”返回“johndoe”,但“Joh”不返回任何内容 型号: class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max

我需要一个简单的搜索工具来搜索我的django网站,所以我选择了Haystack和Solr。我已经正确设置了所有内容,在键入精确的短语时可以找到正确的搜索结果,但在键入部分短语时无法获得任何结果

例如:“John”返回“johndoe”,但“Joh”不返回任何内容

型号:

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
搜索索引:

class PersonIndex(SearchIndex):
    text = CharField(document=True, use_template=True)
    first_name = CharField(model_attr = 'first_name')
    last_name = CharField(model_attr = 'last_name')

site.register(Person, PersonIndex)

我猜我缺少一些设置来支持部分字段匹配。我在一些论坛上看到人们谈论
EdgeNGramFilterFactory()
,我在谷歌上搜索过它,但我不太确定它的实现。另外,我希望有一种特定于干草堆的方法,以防我关闭搜索后端。

我在搜索非英语单词时遇到类似问题,例如:

ABC
ABCD
如果我想搜索关键字
ABC
,我希望得到以上两个结果。通过将关键字转换为小写并使用
startswith
,我实现了以下目标:

keywords = 'ABC'
results.filter(code__startswith=keywords.lower())

我也遇到了同样的问题,获得我想要的结果的唯一方法是修改solr配置文件,以包括ngram过滤,因为默认的标记器是基于空白的。所以改用。我很想知道是否有大海捞针的方法来做同样的事情

我现在不在我的机器旁,但这应该能起作用

<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />

您可以通过将索引的文本字段设置为EdgeNgramField来实现该行为:

class PersonIndex(SearchIndex):
    text = EdgeNgramField(document=True, use_template=True)
    first_name = CharField(model_attr = 'first_name')
    last_name = CharField(model_attr = 'last_name')

除了本页中提到的其他人提示的
EdgeNgramField
(当然还有
NgramField
,如果您使用亚洲语言),我认为值得一提的是,在Django_haystack中,您可以通过以下命令在Solr上运行原始查询:

from haystack.query import SearchQuerySet
from haystack.inputs import Raw
SearchQuerySet().filter(text=Raw(query))
其中,
text
是要搜索的字段,
query
可以是基于Lucene的查询解析器语法(版本或)的任何内容


通过这种方式,您可以轻松地将查询设置为
ABC*
ABC~
或符合语法的任何其他内容。

@riz我还不能评论,或者我会评论,我知道这是一个旧的评论,但如果其他任何人超过此设置,请确保管理.py update\u索引


Blockquote@Liarez你是怎么做到的?我正在使用haystack/elastic search,但无法使其正常工作


当然不会,我演示的例子是只搜索前缀。我正在使用elasticsearch和haystack,这完美地完成了部分匹配的技巧,节省了我几个小时的elasticsearch时间configuration@Liarez你是怎么做到的?我正在使用haystack/elastic搜索,但无法使其运行。更新对我不起作用,但重建索引起作用。如果你的指数很大,要当心!