【问题标题】:How do I do a partial field match using Haystack?如何使用 Haystack 进行部分字段匹配?
【发布时间】:2011-05-22 10:55:26
【问题描述】:

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

例如:“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(),我用谷歌搜索过,但我不太确定它的实现。另外,我希望有一种特定于干草堆的方法,以防我关闭搜索后端。

【问题讨论】:

    标签: django search search-engine django-haystack


    【解决方案1】:

    您可以通过将索引的文本字段设置为 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')
    

    【讨论】:

    • 我正在使用 elasticsearch 和 haystack,这可以完美地完成部分匹配,节省了几个小时的 elasticsearch 配置
    • @Liarez 你是如何让它工作的?我正在使用 haystack/elastic 搜索,但无法正常工作。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      ABC
      ABCD
      

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

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

      【讨论】:

      • 当然不会,我说明的情况是只搜索前缀。
      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

        Blockquote @Liarez 你是如何让它工作的?我正在使用 haystack/elastic 搜索,但无法正常工作。

        【讨论】:

        • 更新对我不起作用,但rebuild_index 起作用了。当心你的索引是否很大!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-16
        • 2018-10-13
        • 2011-09-23
        • 1970-01-01
        相关资源
        最近更新 更多