Solr:使用通配符表示具有空格的字词

时间:2019-01-21 16:55:19

标签: php solr lucene dih solarium

我正在尝试搜索一个末尾带有空格和通配符的术语;即name:John S* Solr无法返回任何结果,尽管我为以下条目建立了索引,并在从Solr Web界面查询*:*时返回了这些结果;

  • 陶氏(John Dow)
  • Johny English
  • 约翰·史密斯

我正在使用带有DIH的Sol7.4和DIH来索引我的数据库,并且正在为我的Web应用程序创建联系人搜索(按姓名和电话)。

我遵循了这个线程Solr wildcard query with whitespace,但是它没有解决问题;

  1. 我尝试将我的字段类型(对于字段name)更改为text_entext_ws,目前更改为text_general,并尝试使用反斜杠“ \ ”,但它没有用。
  2. 尝试Solr“ complex phrase query parser”部分解决了该问题,因为它会极大地增加查询时间,此外,如果该术语末尾包含空格,则Solarium会引发异常,例如“ jhon \ *”,如果我尝试从Solr Web界面运行相同的查询,则没有结果 http://localhost:8983/solr/collection/select?q{!complexphrase inOrder=true}displayName:John\ *
  3. 还尝试了Prefix Query Parser,但没有运气

注意:每次尝试后,我已重新加载solr,清除数据并为其重新编制索引。

预期结果:

  • 当搜索“ John”时,我应该获得所有3个条目:

    • 陶氏(John Dow)
    • Johny English
    • 约翰·史密斯
  • 在搜索将被解析为“ John”的“ John \”时;我应该得到:

    • 道琼斯
    • 约翰·史密斯
  • ,当搜索“ John \ S *”时,我应该得到:

    • 约翰·史密斯

更新#1

search.php

...
    $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"/> -->
...

1 个答案:

答案 0 :(得分:2)

对通配符匹配使用第二个字段,该字段具有附加了LowercaseFilterFactory的KeywordTokenizer。使用copyField指令将内容从主字段复制到第二个基于通配符的字段中。

这样,您可以对常规字段执行常规搜索,而对正确支持通配符的字段执行通配符搜索。

您上面的第二个示例(John\ *)实际上可能只匹配具有John令牌的任何事物(并且您在参数名称=和变量名之间缺少q参数本身。)