【问题标题】:haystack 2 SearchQuerySet with filter by list matching with exact stringhaystack 2 SearchQuerySet,按列表过滤,与精确字符串匹配
【发布时间】:2014-02-04 13:21:52
【问题描述】:

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

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

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

Result 将准确返回 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' 的对象。好的!但我没有找到一种过滤器的解决方案,其中包含列表中的精确值。

我需要你的帮助。谢谢你。

【问题讨论】:

    标签: solr filter django-haystack searchqueryset


    【解决方案1】:

    我找到了一种解决方案。在 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 的部分中包含一些这样的示例会很有趣。

    【讨论】:

      【解决方案2】:

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

      要使字段'not_analyzed'的索引通过indexed参数为False。 因此,在索引字段时,我使用了以下参数。

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

      因此 field_name 将变为 'not_analyzed'

      然后应用您的查询。

      【讨论】:

        猜你喜欢
        • 2014-01-06
        • 1970-01-01
        • 1970-01-01
        • 2011-11-13
        • 1970-01-01
        • 2021-10-18
        相关资源
        最近更新 更多