Django 如何使用Haystack进行局部场匹配?
我需要一个简单的搜索工具来搜索我的django网站,所以我选择了Haystack和Solr。我已经正确设置了所有内容,在键入精确的短语时可以找到正确的搜索结果,但在键入部分短语时无法获得任何结果 例如:“John”返回“johndoe”,但“Joh”不返回任何内容 型号: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
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搜索,但无法使其运行。更新对我不起作用,但重建索引起作用。如果你的指数很大,要当心!