0

如何在 haystack 2.0 中按字符串列表过滤?

在带有 Solr 的 Haystack 1.2 中,如果我有以下代码:

result = SearchQuerySet().models(MyModel).filter(my_field__in=['A', 'B', 'C'])

结果将准确返回 my_field 等于“A”、“B”或“C”的对象。相反,在带有 Solr 的 Haystack 2.0 中,我们将获取 my_field 为“A”、“A 某物”、“B”、“B 某物”的对象。我需要保留 haystack 1.2 的行为。任何的想法?

如果我在 Haystack 2.0 中使用:

result = SearchQuerySet().models(MyModel).filter(my_field=Exact('A'))

我将获得 my_field 等于“A”的对象。好的!但是我没有找到一种过滤器的解决方案,其中包含列表中的精确值。

我需要你的帮助。谢谢。

4

2 回答 2

0

我找到了一种解决方案。在Haystack 2.0中,为 solr 生成的 schema.xml 具有与默认文本字段相关的下一个定义:

   <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="lang/stopwords_en.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
          <filter class="solr.EnglishMinimalStemFilterFactory"/>
        -->
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="lang/stopwords_en.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
          <filter class="solr.EnglishMinimalStemFilterFactory"/>
        -->
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
    </fieldType>

Haystack 1.2中,为 solr 生成的 schema.xml 具有其他定义:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>

      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>

</fieldType>

如果您比较两个定义中的分析器,您可以检查Haystack 1.2版本使用solr.WhitespaceTokenizerFactory,而Haystack 2.0版本使用solr.StandardTokenizerFactory

为了在 Haystack 2.0 中保持 Haystack 1.2 的行为,您可以创建名为“text_exact”的新文本字段类型,其内容与 Haystack 1.2 的文本字段定义的内容相同,然后将 schema.xml 中的所有文本字段与“text_en”相关联" 到 "text_exact"。

从这个版本:

<field name="sales_user" type="text_en" indexed="true" stored="true" multiValued="false" />

我们将获得这个其他版本:

<field name="sales_user" type="text_exact" indexed="true" stored="true" multiValued="false" /> 

Haystack 2.0 官方文档并没有为这个大的变化提供解决方案。在专门用于从 Haystack 1.x 迁移到 2.x 的部分中包含一些这样的示例会很有趣。

于 2014-02-06T07:17:29.847 回答
0

我正在使用 Haystack 2.4.1。我遇到了类似的问题。原因是不应分析该字段。

要使字段“not_analyzed”的索引将索引参数传递为 False。因此,在索引字段时,我使用了以下参数。

    field_name = indexes.CharField(model_attr='db_field',indexed=False)

因此 field_name 将变为“not_analyzed”

之后,您应用您的查询。

于 2015-12-12T18:08:22.087 回答