【问题标题】:Solr query returns 0 resultsSolr 查询返回 0 个结果
【发布时间】:2015-11-01 01:14:19
【问题描述】:

我在 Solr 中索引了一些文档。当我使用q=*:* 查询时,我得到了所有文档,但是当我向 q 发送一些单词时,我没有得到任何结果。下面是schema.xml的sn-p

    <?xml version="1.0" ?>


<schema name="default" version="1.5">
  <types>
    <fieldtype name="string"  class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/>
    <fieldtype name="binary" class="solr.BinaryField"/>


    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
    <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
    <!-- <fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="true"/> -->

    <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
    <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
    <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
    <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>

    <fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0"/>
    <!-- A Trie based date field for faster date range queries and date faceting. -->
    <fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6" positionIncrementGap="0"/>

    <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
    <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
    <fieldtype name="geohash" class="solr.GeoHashField"/>

    <fieldType name="text" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
      <!-- <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> -->
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <!-- <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>

      </analyzer> -->
      <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    </fieldType>

    <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"
                />
        <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"
                />
        <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="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    </fieldType>

    <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      </analyzer>
    </fieldType>

    <fieldType name="ngram" class="solr.TextField" >
      <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15" />
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

    <fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1">
      <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" />
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
      </analyzer>
    </fieldType>
  </types>

  <fields>
    <!-- general -->
    <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
    <field name="django_ct" type="string" indexed="true" stored="true" multiValued="false"/>
    <field name="django_id" type="string" indexed="true" stored="true" multiValued="false"/>
    <field name="_version_" type="long" indexed="true" stored ="true"/>

    <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
    <dynamicField name="*_s"  type="string"  indexed="true"  stored="true"/>
    <dynamicField name="*_l"  type="long"   indexed="true"  stored="true"/>
    <dynamicField name="*_t"  type="text_en"    indexed="true"  stored="true"/>
    <dynamicField name="*_b"  type="boolean" indexed="true"  stored="true"/>
    <dynamicField name="*_f"  type="float"  indexed="true"  stored="true"/>
    <dynamicField name="*_d"  type="double" indexed="true"  stored="true"/>
    <dynamicField name="*_dt" type="date" indexed="true" stored="true"/>
    <dynamicField name="*_p" type="location" indexed="true" stored="true"/>
    <dynamicField name="*_coordinate"  type="tdouble" indexed="true"  stored="false"/>


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

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

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

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

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

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

  </fields>

  <!-- field to use to determine and enforce document uniqueness. -->
  <uniqueKey>id</uniqueKey>

  <!-- field for the QueryParser to use when an explicit fieldname is absent -->
  <defaultSearchField>text</defaultSearchField>

  <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
  <solrQueryParser defaultOperator="OR"/>
</schema>

我可能做错了什么?!

编辑

这是在 Solr 中索引的文档示例。

这是我运行的查询结果为 0:

您可以清楚地看到该文件提到了印度。所以这个文件应该已经被退回了。生成的查询有问题吗?

【问题讨论】:

    标签: django solr lucene django-haystack


    【解决方案1】:

    在这些情况下,我会在我的 http 请求中添加 debugQuery=true 参数。显示的信息包括 Solr 如何看到 q 参数,因此您应该能够了解发生了什么问题。在黑暗中拍摄我猜文档实际上没有被索引,或者您使用了错误的查询解析器(例如 *:* 不是 DisMax 的有效查询)

    您的帖子更新后,我看到了一件奇怪的事情(但也许我错了,我正在通过手机阅读这篇冗长的帖子):

    “文本”字段中没有任何内容...

    您要查找的文档在“内容”字段中有“印度”术语,但 df(查询中使用的默认字段)是“文本”,所以这是正确的行为,没有与“印度”匹配“文本”,因为“文本”为空。您可以执行以下操作之一:

    • 将默认字段从文本更改为内容
    • 在查询中明确命名内容字段(例如 content:india)
    • 用 src=content 和 dst=text 声明一个 copyField 指令

    【讨论】:

      【解决方案2】:

      如果您共享字段类型的定义会很好

      如果您使用了关键字标记器,它是将整个文本字段视为单个标记的标记器。

      尝试使用 StandardTokenizerFactory 或 WhitespaceTokenizerFactory。

      在 WhitespaceTokenizerFactory 的情况下,分词器将文本流拆分为空格并将非空格字符序列作为标记返回。请注意,任何标点符号都将包含在标记化中。

      如果您的输入流是:“印度共和国日的成功”

      输出为:“The”、“success”、“of”、“Republic”、“Day”、“in”、“India”

      如果您再添加任何过滤器,例如停用词过滤器或小写过滤器,这将再次很好。

      举个例子

      <fieldType name="text" class="solr.TextField">
          <analyzer type="index">
              <tokenizer class="solr.WhitespaceTokenizerFactory"/>
              <filter class="solr.LowerCaseFilterFactory"/>
          </analyzer>
          <analyzer type="query">
              <tokenizer class="solr.WhitespaceTokenizerFactory"/>
              <filter class="solr.LowerCaseFilterFactory"/>
          </analyzer>
      </fieldType>
      

      这里的最终输出会有所不同

      如果您的输入流是:“印度共和国日的成功”

      输出是:“the”、“success”、“of”、“republic”、“day”、“in”、“india”

      现在您可以通过“India”和“india”查询...它将得到匹配

      因为在索引时您将其索引为“印度”,而在查询时您有小写过滤器,即使搜索文本是“印度”,它也会使其变为“印度”。

      如果你添加了停用词过滤器工厂

      它不会索引诸如“of”,“the”,“in”之类的词,并且搜索这些词没有意义(我的看法,可能与其他人不同)。

      solr 提供了一个 Web 界面,您可以在其中分析您的字段类型、谁在为流编制索引……您需要更改哪些内容才能获得正确的结果。

      我希望这会有所帮助...

      有关所有标记器和过滤器的更多信息,请查看它..

      https://cwiki.apache.org/confluence/display/solr/Tokenizers#Tokenizers-WhiteSpaceTokenizer

      https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions

      【讨论】:

      • 我已经用整个架构更新了这个问题。进行了您建议的更改。仍然得到 0 个结果。
      • 您尚未更改字段“文本”的 fieldType。之后您需要重新索引相同...目前我看到文本的类型仍然是“text_en”而不是文本...更改相同并让我知道它是否适合您...
      【解决方案3】:

      要么您必须在如下所示的字段名称上触发查询

      q=:内容:印度

      或者您必须定义一个默认字段,以便在 solrconfig 文件中为您的选择处理程序搜索空白查询字符串,如下所示

          <requestHandler name="/select" class="solr.SearchHandler">
              <!-- default values for query parameters can be specified, these
                       will be overridden by parameters in the request
                  -->
               <lst name="defaults">
                   <int name="rows">10</int>
                   <str name="qf">content short_description</str>
               </lst>
          </requestHandler>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-19
        相关资源
        最近更新 更多