2017-04-07 1 views
0

은 내가 SOLR를 사용하여 다음과 같이 필드를 토큰 화하고있다 : 내가 추가SOLR 와일드 카드 문제 ''문자

<field name="Title" type="text_general" multiValued="false" indexed="true" stored="true"> 
    <analyzer> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    </field> 

* 각 검색 필드에서 일치하는 결과를 얻으려면 : 제목 응용 프로그램 * 응용 프로그램 및 유사한 결과를 줄 것이다

그러나 내가 '-'와 함께 용어를 검색하면 검색어가 아무것도 반환하지 못합니다. 예 :

제목 : child-play * 결과 : 하지만 제목은 child-play 않습니다 !!

아무도 저에게 문제점을 지적 할 수 있습니까?


디버그 후 나는이있어 : 제목에 대한 : 아이 플레이 제목에 대한

"debug":{ 
    "rawquerystring":"Title:child-play", 
    "querystring":"Title::child-play", 
    "parsedquery":"Title::child Title::play", 
    "parsedquery_toString":"Title::child Title::play", 

: 아이 플레이 *

"debug":{ 
    "rawquerystring":"CompanyName:child-play*", 
    "querystring":"CompanyName:child-play*", 
    "parsedquery":"CompanyName:child-play*", 
    "parsedquery_toString":"CompanyName:child-play*", 
+0

당신이 사용하는 SOLR의 버전을 지정하십시오 수 : enter image description here

자세한 내용은 여기

https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

인수를 읽어 보시기 바랍니다? – freedev

+0

@freedev solr 6.4.2 – ashwinbhy

답변

2

내가 WordDelimiterFilterFactory를 사용하도록 권장

필드 유형을 " 사용자 정의 유형은

<field name="Title" type="text_general"/> 

이 그럼 당신은 새로운 유형의 예를 들어

, 내 설정을 만들 필요 "내 경우는 'text_general입니다." 원하는대로 사용자 정의 할 수 있습니다.

<fieldType name="text_general" class="solr.TextField" omitNorms="false" positionIncrementGap="100" multiValued="true"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.WordDelimiterFilterFactory" types="wdfftypes.txt" generateNumberParts="0" stemEnglishPossessive="0" splitOnCaseChange="1" preserveOriginal="1" catenateAll="1" catenateWords="1" catenateNumbers="1" generateWordParts="1" splitOnNumerics="1"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.WordDelimiterFilterFactory" types="wdfftypes.txt" generateNumberParts="1" stemEnglishPossessive="0" splitOnCaseChange="1" preserveOriginal="1" catenateAll="1" catenateWords="1" catenateNumbers="1" generateWordParts="1" splitOnNumerics="1"/> 
    </analyzer> 
    </fieldType> 

내 스크린 샷을보세요.

generateWordParts: (integer, default 1) If non-zero, splits words at delimiters. 
For example:"CamelCase", "hot-spot" -> "Camel", "Case", "hot", "spot" 

generateNumberParts: (integer, default 1) If non-zero, splits numeric strings at delimiters:"1947-32" ->"1947", "32" 

splitOnCaseChange: (integer, default 1) If 0, words are not split on camel-case changes:"BugBlaster-XL" -> "BugBlaster", "XL". Example 1 below illustrates the default (non-zero) splitting behavior. 

splitOnNumerics: (integer, default 1) If 0, don't split words on transitions from alpha to numeric:"FemBot3000" -> "Fem", "Bot3000" 

catenateWords: (integer, default 0) If non-zero, maximal runs of word parts will be joined: "hot-spot-sensor's" -> "hotspotsensor" 

catenateNumbers: (integer, default 0) If non-zero, maximal runs of number parts will be joined: 1947-32" -> "194732" 

catenateAll: (0/1, default 0) If non-zero, runs of word and number parts will be joined: "Zap-Master-9000" -> "ZapMaster9000" 

preserveOriginal: (integer, default 0) If non-zero, the original token is 

preserved: "Zap-Master-9000" -> "Zap-Master-9000", "Zap", "Master", "9000" 

protected: (optional) The pathname of a file that contains a list of protected words that should be passed through without splitting. 

stemEnglishPossessive: (integer, default 1) If 1, strips the possessive "'s" from each subword. 
+1

같은 필드에서'child'에 대한 쿼리를 더 이상 일치시키지 않지만 다른 정의를 가진 여러 필드를 사용하면 copyField 명령을 사용하면 하나의 필드에 대해 와일드 카드로 쿼리 할 수 ​​있습니다. 다른 사람을 찾는다. 또한 와일드 카드 검색을 수행 할 때 분석이 매우 제한되어있어 쿼리 할 때와 인덱싱 할 때 토큰 화가 같은 방식으로 수행되지 않는다는 점에서 문제가 발생합니다. – MatsLindh