我有文本字段。 而对于给定的查询,我想找到一个包含索引字段值的所有文档。
query.contains(document.field_name)
实施例:1. FIELD_NAME: “AB” 2. FIELD_NAME: “ABC”
对于查询“ABD”我只想要查找第一个项目。
没有有效的方式做到这基本上是产生的查询和索引字段作为一个字符串的所有子。
是否有可能使用existen功能,实现了Solr的这些要求? 如果没有什么是最有效的算法/办法做到这一点?
PS。 好像谷歌的AdWords做这样的一致的发现增加了。
我想这可能是很难做到这一点在一个单一的Solr的查询。 如果我理解正确你的问题,我想我会做的是记号化的查询字符串,搜索反过来每个令牌,并比较与最初的查询字符串的搜索结果。 例如,假设您的查询字符串是“字词1字词2 TERM3”。 你会搜索每个反过来这些术语:
/solr/index/select?q=term1
这可能返回以下内容:
term1 term2 term4
term1 term2
term1 term2 term3
然后,您可以运行针对您的初始查询进行比较(“字词1字词2 TERM3”),看看它是否包含每个搜索结果。 道歉,如果上面是没有帮助的。
这里是做什么你问一个方式:
字段类型
<fieldType name="exact" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="0" generateWordParts="0" catenateAll="1" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="0" generateWordParts="1" catenateAll="0" />
<filter class="solr.ShingleFilterFactory" outputUnigrams="true" outputUnigramsIfNoShingles="true" tokenSeparator="" maxShingleSize="99"/>
</analyzer>
</fieldType>
说明:
该指数分析仪使用WordDelimiterFilterFactory
分裂字段值成单词。 因此,使用你的榜样, ab
被分成的话a
和b
,和abd
被分成a
, b
和d
。 我们设置catenateAll="1"
和generateWordParts="0"
,因此单个的单词被丢弃,从而产生一个单一的字。 a
和b
成为ab
和a
, b
和d
成为abd
。
该分析仪用于查询与细微的差别相似。 我们分裂值放入话,除了我们不放弃的话或将它们连接起来。 取而代之的是,我们通过话到ShingleFilterFactory
,它接受a
和b
,并返回a
, b
和ab
。
我们用,而不是串联带状疱疹的原因是为了让abc
相匹配ab
和bc
。 如果你想abc
只匹配abc
,设置catenateAll="1"
,并删除了瓦厂。
使用该配置, ab
将匹配仅a
, b
,和ab
(未abd
)。 此外, abc
将匹配a
, b
, c
, ab
, bc
,和abc
。 还应当指出的是, ab
将匹配ab
。 如果有任何这不是你想要的,你应该能够配置瓦和文字过滤器工厂做的正是你需要的。
编辑 :这个答案以前的版本放魔法值 ,以纪念价值的开始和结束。 原来,是不必要的; 只是串联的值加在一起,就足以防止ab
从匹配abd
。
编辑2( 指数分析仪固定 ): WhitespaceTokenizerFactory
应该已经KeywordTokenizerFactory
。 此外, WordDelimiterFilterFactory
应该有catenateAll="0"