特殊字符( - & +等)在SOLR查询中不起作用

时间:2012-09-27 11:31:17

标签: solr

我正在使用“text_general”fieldType在SOLR中进行搜索。在搜索特殊字符时,我没有得到正确的结果并且出错。我想使用这样的特殊字符:

  1. -
  2. &
  3. +
  4. 查询

    1. solr?q=Healing - Live

    2. solr?q=Healing & Live

    3. 错误消息

        

      客户端发送的请求在语法上是不正确的   (org.apache.lucene.queryParser.ParseException:无法解析'(“治愈)   \':第1行第8列的词法错误。遇到:之后:   “\”治疗\“)。

      schema.xml中

      <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
          <tokenizer class="solr.StandardTokenizerFactory"/>               
          <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
          <filter class="solr.ASCIIFoldingFilterFactory" />
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
          <tokenizer class="solr.StandardTokenizerFactory"/>
          <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
          <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
          <filter class="solr.ASCIIFoldingFilterFactory" />
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
      </fieldType>
      
      
      <field name="title" type="text_general" indexed="true" stored="true" />
      
      <field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
      
      <defaultSearchField>text</defaultSearchField>
      
      <copyField source="title" dest="text"/>
      

4 个答案:

答案 0 :(得分:9)

您需要转义查询,因为短划线是lucene查询中的特殊字符。如果您想了解有关lucene查询语法的更多信息,请查看您应该转义的其他字符herehere

您的查询将如下所示:solr?q=Healing \- Live

我不知道您使用哪种语言编写代码,但如果您使用的是Java solrj,则提供ClientUtils#escapeQueryChars方法。

答案 1 :(得分:1)

基于日光浴的Solr搜索:

app\code\local\Module\Solarium\controllers\AjaxController.php

function suggestAction()
{

    //get comp from http://[MAGE-ROOT]/solarium/ajax/suggest/?q=comp
    $comp = $this->getRequest()->getParam('q',false);

    //remove special characters
    $special_characters = array('(',')','/','\','&','!','.','-','+');
    $comp = str_replace($special_characters,'',$comp);

    //save q param
    $this->getRequest()->setParam('q',$comp);

    //existing code
    ...............

}

答案 2 :(得分:0)

StandardTokenizerFactory是您应该使用WhitespaceTokenizerFactory的问题。这对我有用。

答案 3 :(得分:-1)

为什么不使用AND OR NOT而不是那些特殊字符。

例如:

Healing NOT Live
Healing AND Live
Healing OR Live