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

Ben*_*n S 19 django search search-engine django-haystack

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

例如:"John"返回"John Doe",但"Joh"不返回任何内容.

模型:

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

搜索索引:

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)
Run Code Online (Sandbox Code Playgroud)

我猜测有一些我缺少的设置可以实现部分字段匹配.我见过人们EdgeNGramFilterFactory()在一些论坛上谈论过,我用谷歌搜索过它,但我不太确定它的实现.另外,我希望有一个特定于干草堆的方式,以防万一我切换到搜索后端.

Fac*_*ano 16

您可以通过使索引的文本字段成为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')
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用elasticsearch&haystack,这样可以完美地完成部分匹配的技巧,从而节省了一些时间的弹性搜索配置 (2认同)
  • @Liarez你是怎么得到这个的?我正在使用干草堆/弹性搜索,我无法让它工作. (2认同)

Thi*_*Lam 1

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

ABC
ABCD
Run Code Online (Sandbox Code Playgroud)

如果我想搜索关键词ABC,我会期待上面两个结果。我能够通过将关键字转换为小写并使用来实现以下目标startswith

keywords = 'ABC'
results.filter(code__startswith=keywords.lower())
Run Code Online (Sandbox Code Playgroud)