21

我的 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)

搜索索引:

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(),我已经用谷歌搜索了它,但我不太确定它的实现。另外,我希望有一种特定于干草堆的方法,以防我切换搜索后端。

4

5 回答 5

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')
于 2013-04-18T12:33:46.087 回答
2

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

from haystack.query import SearchQuerySet
from haystack.inputs import Raw
SearchQuerySet().filter(text=Raw(query))

wheretext是您要搜索的字段,query可以是基于Lucene的查询解析器语法(版本3.64.6 )的任何内容。

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

于 2013-05-22T19:02:47.167 回答
1

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

ABC
ABCD

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

keywords = 'ABC'
results.filter(code__startswith=keywords.lower())
于 2011-03-31T20:43:30.883 回答
1

我遇到了同样的问题,获得我想要的结果的唯一方法是修改 solr 配置文件以包含 ngram 过滤,因为默认标记器基于空格。所以请改用NGramTokenizer。我很想知道是否有干草堆的方式来做同样的事情。

我现在不在我的机器上,但这应该可以解决问题。

<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />
于 2011-06-14T22:01:09.700 回答
0

@riz 我还不能发表评论,或者我会,我知道这是一个旧评论,但万一其他人跑过这个:确保 manage.py update_index

Blockquote @Liarez 你是如何让它工作的?我正在使用干草堆/弹性搜索,但我无法让它工作。

于 2015-05-21T02:44:02.320 回答