我正在尝试一种通过将串行字符串标记为多值字段内的单个术语来解决搜索要求的方法。基本上,每个文档可能包含多个用于搜索的值。用户搜索可以匹配多值字段内的任何值,但是,所有术语都必须匹配该多值字段内单个项目的值。所以这是我的设置
我有一个字段类型,我们称之为“tokensearch”
<fieldType name="tokensearch" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.PatternTokenizerFactory" pattern="\|\s*" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.PatternTokenizerFactory" pattern="\ \s*" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
一个示例数据字段将是
<arr name="tokensearch">
<str>a:3|b:3|c:3|d:5|e:5</str>
<str>a:1|b:3|c:5|d:4|e:2</str>
<str>a:2|b:3|c:3|d:2|e:1</str>
</arr>
这基本上会在 solr 中创建一个多维数组,所以它看起来像这样
a[0]=array(a:3,b:3,c:3..)
a[1] = array(a:1,b:3,c:5..)
该部分正在正常工作,但是当我执行搜索"a:1 c:5"
应该发生的事情时,我的查询解析器应该说给我顶部数组的单个项目同时包含 a:1 和 c:5 的字段
现在,只要它们按“a:1 b:3 c:5”的顺序出现,它就会匹配数组 [1],但“a:1 c:5”不会。
这就是我的设置,我的目标是在多值字段中具有可指定的值组合,其中传递的所有令牌都必须匹配。
我现在的查询很简单 q=tokensearch:"a:1 c:3"
我试过玩查询,但这似乎最接近我需要的 q=tokensearch:"a:1" tokensearch:"c:3"&q.op=AND - 返回包含 a:1 和 c 的文档: 3 在多值数组的不同条目中
如果您需要有关我正在尝试的更多信息,请告诉我。如果您知道如何进行这项工作,这样我就不必按确切的顺序指定令牌,那就太好了。
另外:当我做一个字段分析器时,它确实会乱序匹配我的令牌,所以我有点困惑为什么它不会在真正的搜索中