4

SOLRでの検索に「text_general」fieldTypeを使用しています。特殊文字で検索すると、適切な結果が得られず、エラーが発生します。次のような特殊文字を使用したいと思います。

  1. -
  2. &
  3. +

クエリ

  1. solr?q=Healing - Live

  2. solr?q=Healing & Live

エラーメッセージ

クライアントから送信された要求は構文的に正しくありませんでした (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

4 に答える 4

9

ダッシュは lucene クエリの特殊文字であるため、クエリをエスケープする必要があります。エスケープする必要があるその他の文字については、こちらをご覧ください。lucene クエリ構文について詳しく知りたい場合は、こちらをご覧ください。

クエリは次のようになります。solr?q=Healing \- Live

コードを書いている言語はわかりませんが、Java を使用している場合、solrj はClientUtils#escapeQueryCharsメソッドを提供します。

于 2012-09-27T11:56:09.033 に答える
2

Solarium に基づく Solr 検索の場合:

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

関数SuggestAction()
{

    // http://[MAGE-ROOT]/solarium/ajax/suggest/?q=comp からコンプを取得
    $comp = $this->getRequest()->getParam('q',false);

    //特殊文字を削除
    $special_characters = array('(',')','/','\','&','!','.','-','+');
    $comp = str_replace($special_characters,'',$comp);

    // q パラメータを保存
    $this->getRequest()->setParam('q',$comp);

    //既存のコード
    ...............

}
于 2015-09-04T18:06:10.417 に答える
1

StandardTokenizerFactory は、WhitespaceTokenizerFactory を使用する必要がある問題です。これは私にとってはうまくいきました。

于 2015-02-11T13:58:15.673 に答える
0

AND OR NOTこれらの特殊文字の代わりに使用してみませんか。

例えば:

Healing NOT Live
Healing AND Live
Healing OR Live
于 2012-10-07T12:42:47.313 に答える