1

我遇到了这里详述的问题。我有一个将床和浴室信息存储到其中的文本字段,同时索引我分别为 2 个床和 3 个浴室存储 2b 3bt 之类的值。最后,我需要支持“2beds 3baths”、“beds 2 3baths”、“2bed rooms 3baths”、“2bd 3bth”等查询。

为此,我使用 text_general 类型的文本字段,如下所示

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


    <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" enablePositionIncrements="true" />       
       <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
       <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(?i)((\d\.?\d{0,2})\s*(bed\s*rooms|bed\s*room|beds|bed|bdr|bd|br|b)|(bed\s*rooms|bed\s+room|beds|bed|bdr|bd|br|b)\s*(\d\.?\d{0,2}))" replacement="$2$5b" />
       <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(?i)((\d\.?\d{0,2})\s*(bath\s*rooms|bath\s*room|baths|bath|bth|bt|bh|ba)|(bath\s*rooms|bath\s*room|baths|bath|bth|bt|bh|ba)\s*(\d\.?\d{0,2}))" replacement="$2$5bt" />     
       <tokenizer class="solr.StandardTokenizerFactory"/>
       <filter class="solr.TrimFilterFactory" updateOffsets="true"/>        
       <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />        
       <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    </fieldType>

我尝试使用管理界面进行 Solr 查询,它几乎适用于所有组合,除了中间空间的情况,如“6 床 6 浴室”或“6 卧室 6 浴室”同时“6 床 6 浴室”让我正确结果。这是我为这个查询传递给 solr 的参数的 url

    /solr/select?q=6b+6ba&wt=xml&indent=true&q.op=AND

我检查了每个案例的 Solr 管理分析界面,并没有发现任何差异。由于分析阶段产生了相同的结果,我希望这两个查询的工作方式相似。谁能指导我,为什么这两个查询的行为方式不同?

这就是我在 solr 管理分析界面上看到的两个有问题的查询

    For input : 6 beds 6 bath room,

    PRCF 6b 6bath room
    PRCF 6b 6bt
    ST   6b | 6bt
    TF   6b | 6bt
    SF   6b | 6bt
    LCF  6b | 6bt

    For input : 6b 6bt
    PRCF 6b 6bt
    PRCF 6b 6bt
    ST   6b | 6bt
    TF   6b | 6bt
    SF   6b | 6bt
    LCF  6b | 6bt

示例输入和输出- 这是我尝试使用上面已经提到的字段定义的一些示例输入,注意:(#) 只是序列号,不是输入的一部分

   (1) 2beds 3baths Fresno
   (2) 3baths 2beds Fresno
   (3) Fresno 2bedroom 3bathroom
   (4) beds2 3baths Fresno
   (5) beds2 bathrooms3 Fresno

即使现在,上述所有内容都可以正常工作,以下是当前字段定义对我来说仍然值得关注的一些输入

   (6) 2 beds 3 baths Fresno
   (7) 2 bed rooms 3 baths Fresno
   (8) Fresno 2 bed room  3 baths
   (9) Fresno 3baths 2   bed rooms

我期望在分析阶段之后以相同的序列号顺序对上述输入的输出如下(在索引 2beds 3 baths 时,我将数据索引为 2b 3bt),

   (1) 2b 3bt Fresno
   (2) 3bt 2b Fresno
   (3) Fresno 2b 3bt
   (4) 2b 3bt Fresno
   (5) 2b 3bt Fresno
   (6) 2b 3bt Fresno
   (7) 2b 3bt Fresno
   (8) Fresno 2b 3bt
   (9) Fresno 3bt 2b 

但到目前为止,我认为我做得很好,因为我可以生成与我通过 Solr 管理分析界面确认的完全相同的分析输出,这里真正的问题是我可以获取查询以获取正确的搜索结果输入的第一部分(即)到 #5 但对于从 #6 到 #9 的输入我没有得到任何结果

这是我尝试输入 #1 的示例查询格式,即 2beds 3baths Fresno

    /solr/collection1/select?q=2beds+3baths+Fresno&wt=xml&indent=true&q.op=AND

而这个为#6,即)2 床 3 浴室弗雷斯诺

/solr/collection1/select?q=2+beds+3+baths+Atlanta&wt=xml&indent=true&q.op=AND
4

1 回答 1

0

我在这里应用的最终解决方案如下,

我从查询时间分析器中删除了床和浴室的 PatternReplaceCharFilterFactory,并对来自我的 servlet 的输入文本进行了类似的模式替换。

所以现在对于以下输入文本

    2 beds 3 baths Fresno

从我的 servlet 代码中,我将其转换为

    2b 3bt Fresno

这就是我然后传递给 solr 的工作......现在工作正常

这是 text_general 字段的修改后的字段类型定义,

    <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" enablePositionIncrements="true" />
         <filter class="solr.LowerCaseFilterFactory"/>
     </analyzer>
     <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.TrimFilterFactory" updateOffsets="true"/>       
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.LowerCaseFilterFactory"/>
     </analyzer>
  </fieldType>
于 2013-03-14T04:33:28.017 回答