我正在尝试搜索一个末尾带有空格和通配符的术语;即name:John S*
Solr无法返回任何结果,尽管我为以下条目建立了索引,并在从Solr Web界面查询*:*
时返回了这些结果;
我正在使用带有DIH的Sol7.4和DIH来索引我的数据库,并且正在为我的Web应用程序创建联系人搜索(按姓名和电话)。
我遵循了这个线程Solr wildcard query with whitespace,但是它没有解决问题;
name
)更改为text_en
,text_ws
,目前更改为text_general
,并尝试使用反斜杠“ \ ”,但它没有用。 http://localhost:8983/solr/collection/select?q{!complexphrase inOrder=true}displayName:John\ *
注意:每次尝试后,我已重新加载solr,清除数据并为其重新编制索引。
当搜索“ John”时,我应该获得所有3个条目:
在搜索将被解析为“ John”的“ John \”时;我应该得到:
,当搜索“ John \ S *”时,我应该得到:
...
$term = str_replace(' ', '\ ', $request_params['term']);
$query->setQuery('phone:"%1%" OR name:"%1%" OR contact:%2%*', [$request_params['term'], $term]);
// $query->setQuery('phone:"%1%" OR name:"%1%" OR contact:"%2%*"', [$request_params['term'], $term]);
...
...
<fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
...
<field name="name" type="text_general" multiValued="false" indexed="true" stored="true"/>
<field name="contact" type="lowercase" indexed="true" stored="true"/>
<field name="phone" type="string" docValues="false" multiValued="false" indexed="true" required="true" stored="true"/>
<copyField source="displayName" dest="card"/>
<!-- <copyField source="phone" dest="card"/> -->
...
答案 0 :(得分:2)
对通配符匹配使用第二个字段,该字段具有附加了LowercaseFilterFactory的KeywordTokenizer。使用copyField指令将内容从主字段复制到第二个基于通配符的字段中。
这样,您可以对常规字段执行常规搜索,而对正确支持通配符的字段执行通配符搜索。
您上面的第二个示例(John\ *
)实际上可能只匹配具有John令牌的任何事物(并且您在参数名称=
和变量名之间缺少q
参数本身。)