我在这里阐述了一个问题。我有一个文本字段,存储床和浴室的信息,而索引,我存储的值,如2b3bt,分别为2张床和3浴室。最后,我需要支持查询,如"2张床3浴室“,”床2 3浴室“,"2床房3浴室”,"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
在以相同的序列号顺序对上述输入进行分析后,我期望的输出如下(在为2张床3浴室编制索引时,我将数据索引为2b3bt),
(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
/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
发布于 2013-03-14 04:33:28
我在这里应用的最后一个解决方案如下,
我从查询时间分析器中删除了床和浴室的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>
https://stackoverflow.com/questions/15378457
复制相似问题