无法在Solr中搜索两个以上的单词

时间:2019-03-13 10:51:06

标签: solr

我正在使用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>

2 个答案:

答案 0 :(得分: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 (查询:正确执行)将在title字段中仅找到“ Do”。它将在默认字段(在本例中为文本字段)中找到“ it”和“ right”。

答案 1 :(得分:0)

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>