2017-04-20 3 views
0

나는 직업에 대한 인덱스 (식별자 + 직업)이 있습니다SOLR 및 악센트 문자

<field name="occ_id" type="int" indexed="true" stored="true" required="true" /> 
<field name="occ_tx_name" type="text_es" indexed="true" stored="true" multiValued="false" /> 


<!-- Spanish --> 
<fieldType name="text_es" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_es.txt" format="snowball" /> 
    <filter class="solr.SpanishLightStemFilterFactory"/> 
    </analyzer> 
</fieldType> 

이 세 가지 식별자 (1, 195, 129)에 대한 실제 쿼리입니다 :

curl -X GET "http://192.168.1.11:8983/solr/cyp_occupations/select?indent=on&q=occ_id:1+occ_id:195+occ_id:129&wt=json" 
{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":1, 
    "params":{ 
     "q":"occ_id:1 occ_id:195 occ_id:129", 
     "indent":"on", 
     "wt":"json"}}, 
    "response":{"numFound":3,"start":0,"docs":[ 
     { 
     "occ_id":1, 
     "occ_tx_name":"Abogado", 
     "_version_":1565225103805906944}, 
     { 
     "occ_id":129, 
     "occ_tx_name":"Informático", 
     "_version_":1565225103843655680}, 
     { 
     "occ_id":195, 
     "occ_tx_name":"Osteópata", 
     "_version_":1565225103858335746}] 
    }} 

그들 중 두 명은 악센트 부호가있는 문자를 가지고 있습니다. 그럼 악센트를 사용하지 않고 occ_tx_name로 검색하자 'INFORMATICO가'성공하면서

curl -X GET "http://192.168.1.11:8983/solr/cyp_occupations/select?indent=on&q=occ_tx_name:abogado&wt=json" 
{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":1, 
    "params":{ 
     "q":"occ_tx_name:abogado", 
     "indent":"on", 
     "wt":"json"}}, 
    "response":{"numFound":1,"start":0,"docs":[ 
     { 
     "occ_id":1, 
     "occ_tx_name":"Abogado", 
     "_version_":1565225103805906944}] 
    }} 

curl -X GET "http://192.168.1.11:8983/solr/cyp_occupations/select?indent=on&q=occ_tx_name:informatico&wt=json" 
{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":0, 
    "params":{ 
     "q":"occ_tx_name:informatico", 
     "indent":"on", 
     "wt":"json"}}, 
    "response":{"numFound”:1,”start":0,"docs":[ 
     { 
     "occ_id":129, 
     "occ_tx_name":"Informático", 
     "_version_":1565225103843655680}] 
    }} 


curl -X GET "http://192.168.1.11:8983/solr/cyp_occupations/select?indent=on&q=occ_tx_name:osteopata&wt=json" 
{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":0, 
    "params":{ 
     "q":"occ_tx_name:osteopata", 
     "indent":"on", 
     "wt":"json"}}, 
    "response":{"numFound":0,"start":0,"docs":[] 
    }} 

나는 마지막 검색 'osteopata은'실패는 사실에 대해 매우 성가신입니다.

-- ----------------------------------------------------- 
-- Table `mydb`.`occ_occupation` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`occ_occupation` (
    `occ_id` INT UNSIGNED NOT NULL, 
    `occ_tx_name` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`occ_id`) 
ENGINE = InnoDB 

테이블의 데이터 정렬 "utf8mb4_general_ci"입니다 : 인덱스의 소스 데이터는 간단한 MySQL의 테이블입니다. 색인은 DataImportHandler로 작성됩니다. 이 정의는 다음과 같습니다.

<dataConfig> 
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.1.11:3306/mydb" 
     user=“mydb” password=“mydb” /> 
    <document name="occupations"> 
     <entity name="occupation" pk="occ_id" 
      query="SELECT occ.occ_id, occ.occ_tx_name FROM occ_occupation occ WHERE occ.sta_bo_deleted = false"> 
      <field column="occ_id" name="occ_id" /> 
      <field column="occ_tx_name" name="occ_tx_name" /> 
     </entity> 
    </document> 
</dataConfig> 

문제를 발견하는 데 약간의 단서가 필요합니다. 누구든지 나를 도울 수 있습니까? 미리 감사드립니다.

+0

나는 solr-6.3.0을 사용하고 있다는 것을 잊어 버렸고 다음 명령으로 서버를 시작했습니다. solr start -a "-Duser.language = es -Duser.country = ES -Duser.timezone = 유럽/마드리드 " –

답변

0

좋아, 소스 문제를 발견했습니다. 16 진수 모드로 VI를 사용하여 SQL로드 스크립트를 열었습니다.

INSERT 문에서 'Agrónomo'의 16 진수 내용입니다. 41 67 72 6f cc 81 6e 6f 6d 6f.

6f cc 81!!!! This is "o COMBINING ACUTE ACCENT" UTF code!!!! 

은 그래서 나는 리터럴 웹 페이지에서/붙여 넣기를 복사 할 수 있으므로 기원에 소스 문자가 문제였다 ... 그것은 "C3의 B3"여야 문제입니다.

SOLR의 영혼에 대해 더 많이 알고 있기 때문에 두 분 모두에게 감사드립니다.

감사합니다.

0

mysql 또는 jvm 설정과 관련이 없다고 생각합니다. 하나는 작동하고 다른 하나는 SpanishLightStemFilterFactory 때문일 것으로 생각됩니다.

올바른 방법은 발음 구별 부호는 다음 사용하는 것입니다 상관없이 일치 달성하기 :

<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 

여러분 모두 인덱스 및 쿼리 분석기 체인에서 토크 나이, 및 발음 구별하기 전에 ASCII 버전으로 변환되어야 함을 넣어 . 그렇게하면 항상 효과가 있습니다.

+0

안녕하세요. 그것은 작동하지 않았다. 같은 결과 : ( –

+0

분석 탭으로 이동 봇 인덱스와 쿼리 측면에서 해당 단어의 상세한 출력을 보시오 – Persimmonium

+0

Solr Admin에서 색인을 선택한 다음 스키마 섹션을 클릭했습니다. 필드 'occ_tx_name'및 'Load term info'버튼을 클릭하면 상위 10 개 용어가 나열됩니다. 모든 용어를 보려면 10 개에서 278 개로 변경했습니다. 목록의 각 용어는 HTML 앵커, 해당 링크 SOLR 질의에. 그리고, 나는 내가보고 있다는 것을 믿을 수 없다. ... –

0

그냥 필터 분석기 체인에 solr.ASCIIFoldingFilterFactory을 추가하거나 더 나은 새로운 fieldType를 만들 :

<!-- Spanish --> 
<fieldType name="text_es_ascii_folding" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.ASCIIFoldingFilterFactory" /> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_es.txt" format="snowball" /> 
    <filter class="solr.SpanishLightStemFilterFactory"/> 
    </analyzer> 
</fieldType> 

이 필터는 기본 라틴 유니 코드 블록에없는, 알파벳, 숫자 및 기호 유니 코드 문자로 변환 (첫 번째 ASCII 문자 127 개)를 해당 ASCII 문자열에 해당하는 ASCII 문자로 변환합니다.

악센트 부호가없는 문자가 있어도 검색을 일치시켜야합니다. "cañon"과 "canon"과 같은 단어가 이제는 동일하고 두 문서 모두 IIRC와 동일한 문서를 사용한다는 것이 단점입니다.

+0

안녕하세요. 필터 "solr.ASCIIFoldingFilterFactory"를 추가했지만 정확한 결과를 얻었습니다 ... –

+0

전체 컬렉션을 다시 색인해야합니다. – freedev