我有一个通配符查询,看起来像:
q=location:los a*
我想它匹配“洛杉矶”和“洛斯阿尔托斯”。 查询,如:
q=los*
工作得很好,但只要我添加空格我没有得到任何结果。 我怎么能在我的通配符查询使用空白?
我有一个通配符查询,看起来像:
q=location:los a*
我想它匹配“洛杉矶”和“洛斯阿尔托斯”。 查询,如:
q=los*
工作得很好,但只要我添加空格我没有得到任何结果。 我怎么能在我的通配符查询使用空白?
我最近遇到这个问题我自己,似乎所有你需要做的就是逃避查询的空间。 您原来的查询将通过Solr的被理解为是这样的:
location:los id:a*
(假设“ID”是默认搜索字段)
但是,如果你写你的查询为:
location:los\ a*
然后,它最终会被解析为:
location:los a*
和上面应该得到你的愿望(假设你的数据被正确索引)的结果。
提示:搞清楚这一切了很简单。 只需添加&debugQuery=on
你提交查询时,看它是如何解析的Solr使用url结束。
解决方案使用复杂的查询分析器您的问题:
q={!complexphrase inOrder=true}location:"los a*"
为了更多地了解复杂的短语查询分析器,结账这个环节! https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-ComplexPhraseQueryParser
如果你只使用它通配符的后缀,因为我们是我可能会建议Solr的前缀查询插件http://lucene.apache.org/solr/4_0_0/solr-core/org/apache/solr/search/PrefixQParserPlugin。 HTML
例如使用
http://localhost:8983/solr/collection/select?q={!prefix%20f=name}Bob%20Smi
将匹配“Bob Smith的”或“鲍勃·斯密特”,但不能转换成的(“鲍勃”或“SMI *”)的检查,如果你用你可能会沿着线的考虑的第一个解决方案将发生q=name:Bob%20Smi*
希望这是一些帮助你或其他人寻找一个简单的解决方案,因为我敲我的头靠在墙上几个小时,我发现这之前!
没有看到你的配置,我会说使用KeywordTokenizerFactory为你空白可能标记化了。
查询(假设你有空白标记者):Q =位置:洛杉矶一个*意味着你搜索与“基洛” Word文档,并与“A”开头的单词
Solr的(尽可能多的,我知道),无法确定是否一个字(或任期)之前,另一个出现。
我想你应该使用这样的配置
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.PatternReplaceFilterFactory" pattern="(\s+)" replacement="" replace="all" />
</analyzer>
</fieldType>
你必须处理你输入的关键字搜索广告作为删除空白
对于我的工作
<fieldtype name="text_like" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="1000"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
</analyzer>
</fieldtype>
和查询field:*some\ phrase*
(Java中的文字一个需要逃避\为\\)。
我在我的项目有同样的问题。 当过我是搜索词与我没有歌厅结果的空白一起。 所以我取代用连字符空格“ - ”,而索引和查询。 下面是我用来做这样的schema.xml snipet:
<fieldType name="text_ci" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="250"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.PatternReplaceFilterFactory"
pattern="([/\s+])" replacement="-" replace="all"
/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="250"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.PatternReplaceFilterFactory"
pattern="([/\s+])" replacement="-" replace="all"
/>
</analyzer>
</fieldType>