首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Solr查询不适用于带有空格的输入,尽管分析阶段的输出似乎可以工作。

Solr查询不适用于带有空格的输入,尽管分析阶段的输出似乎可以工作。
EN

Stack Overflow用户
提问于 2013-03-13 06:28:53
回答 1查看 812关注 0票数 1

我在这里阐述了一个问题。我有一个文本字段,存储床和浴室的信息,而索引,我存储的值,如2b3bt,分别为2张床和3浴室。最后,我需要支持查询,如"2张床3浴室“,”床2 3浴室“,"2床房3浴室”,"2bd 3bth“.

为了达到这个目的,我使用了一个text_general类型的文本字段,如下所示

代码语言:javascript
运行
复制
    <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

代码语言:javascript
运行
复制
    /solr/select?q=6b+6ba&wt=xml&indent=true&q.op=AND

我检查了每一种情况下的Solr管理分析接口,发现没有任何区别。当分析阶段产生相同的结果时,我期望这两个查询都能工作类似的工作。任何一个人都可以告诉我,为什么这两个问题的表现不一样呢?

这就是我在solr管理分析接口中看到的两个查询的内容。

代码语言:javascript
运行
复制
    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

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

代码语言:javascript
运行
复制
   (1) 2beds 3baths Fresno
   (2) 3baths 2beds Fresno
   (3) Fresno 2bedroom 3bathroom
   (4) beds2 3baths Fresno
   (5) beds2 bathrooms3 Fresno

即使现在,上面的所有内容都很好,这里有一些输入仍然是我对当前字段定义的关注。

代码语言:javascript
运行
复制
   (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

在以相同的序列号顺序对上述输入进行分析后,我期望的输出如下(在为2张床3浴室编制索引时,我将数据索引为2b3bt),

代码语言:javascript
运行
复制
   (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,即,2张床,3bath,Fresno

代码语言:javascript
运行
复制
    /solr/collection1/select?q=2beds+3baths+Fresno&wt=xml&indent=true&q.op=AND

这一张是#6,即2张床,3张弗雷斯诺浴

代码语言:javascript
运行
复制
/solr/collection1/select?q=2+beds+3+baths+Atlanta&wt=xml&indent=true&q.op=AND
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-14 04:33:28

我在这里应用的最后一个解决方案如下,

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

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

代码语言:javascript
运行
复制
    2 beds 3 baths Fresno

从servlet代码中,我将它转换为

代码语言:javascript
运行
复制
    2b 3bt Fresno

这就是我后来传给solr去做的.现在一切都很好

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

代码语言:javascript
运行
复制
    <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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15378457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档