2017-04-07 99 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> 

我追加*在每個搜索領域獲得匹配結果: 標題:*相關 例如應用程序*會給我的應用程序,應用程序和類似的結果

但是,如果我搜索與' - '在其中查詢無法返回任何內容。 例如:

標題:孩子玩* 不返回任何結果 但標題:兒童玩不!

任何人都可以指出我可能會遇到什麼問題。


調試後,我得到這個: 標題:孩子玩

"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的版本? – freedev

+0

@freedev solr 6.4.2 – ashwinbhy

回答

2

我建議你使用WordDelimiterFilterFactory

只需將字段類型更改爲「自定義類型」,在我的情況下,它是「text_general」

<field name="Title" type="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> 

看看我的截圖。 enter image description here

請在這裏閱讀更多信息

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

參數:

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