【问题标题】:Unable to search more than two words in Solr无法在 Solr 中搜索两个以上的单词
【发布时间】:2019-03-15 14:39:34
【问题描述】:

我正在使用 apache-solr-3.4.0。我可以使用一个单词进行搜索,但无法使用多个单词进行搜索。例如:jobTitle:tester 产生结果,但 jobTitle:java developer 不返回任何结果。

在我的 schema.xml 中,我为文本字段类型添加了如下代码:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
      <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize=  "5"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
      <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="5"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

【问题讨论】:

  • 尝试用引号将这些术语括起来:jobTitle:"java developer",否则查询将被解释为jobTitle:java _text_:developer。您还可以将“debugQuery=true”传递给您的查询,并在结果中查看 Solr 如何解析您的查询并确保它按照您的预期进行。
  • 我同意@Hector...我错过了那部分...

标签: solr


【解决方案1】:

您有多种选择,按易用性排序

  1. 使用括号() 将查询的部分放在一个字段中以对它们进行分组,例如jobTitle:(java developer)不要简单地在它们周围加上引号",这将作为不同的短语查询执行。
  2. 使用local params 为每个查询定义一个备用默认字段,例如{!df=jobTitle}java developer。这将使查询的所有部分都转到该字段。
  3. 在每个请求处理程序的 solrconfig.xml 中指定更好的默认搜索字段,这需要在配置后重新启动
  4. 默认使用 eDismax 或 Dismax 查询处理程序,定义搜索输入应针对的字段。您可以将它们想象为选项 (2) 的扩展,其中您有多个默认字段。这将要求您更改 solrconfig.xml,但不需要您重建索引。
  5. 改进默认字段的内容,使其更好地捕获包含所有字段或至少所有相关字段的所有内容的所有字段。这需要您考虑架构设计、更改 schema.xml 并重建索引。

背景
想象一下,Solr 在每个空白处将您的搜索查询分成几部分(实际上它并不那么简单,但对于开始来说已经足够好了)。每个部分都根据分配的字段或默认字段进行处理。取自Solr's manual

该字段仅对其直接前面的词有效,因此查询 title:Do it right 将在标题字段中仅找到“Do”。它将在默认字段(在本例中为文本字段)中找到“it”和“right”。

【讨论】:

    【解决方案2】:

    Solr 还有一个NGramFilterFactoryN-gram filter。尽量不要使用 ngram 分词器。我建议使用“WhitespaceTokenizer”,然后应用 ngram 过滤器。

    <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" />
    

    你的字段类型应该是这样的:

    <fieldType name="text_custom" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="10" />
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    

    【讨论】:

    • 添加并重新启动了tomcat,但仍然无法正常工作。我需要对 apache 或任何其他配置做任何事情吗?
    • 还是其他权限问题?
    • 将字段类型添加到 schema.xml 后。为您的字段使用相同的字段类型。完成后重启tomcat。如果您的更改正在反映,请在 solr 管理页面上查看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多