【发布时间】:2018-12-13 13:00:25
【问题描述】:
所以我遇到了一个有趣的问题。我正在尝试针对日文字符优化我在日本的 solr 索引。
本质上,问题在于 Solr 没有识别带有长标记的单词和没有长标记的单词是同一个单词。我不懂日语,但我正在和懂日语的人一起工作,他们告诉我,当你搜索 ビームエキスパンダー 时,它会返回结果。
但是,如果您搜索 ビームエキスパンダ,这是同一个词,但减去末尾的长标记,它不会返回任何结果。我们被编入索引的内容都包含 ビームエキスパンダー,但我们本质上希望 solr 包含内容,即使您不搜索长标记以包含带有长标记的内容。
对于我正在查看的字段,这就是我们的日语模式的样子。
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.JapaneseTokenizerFactory" mode="search" userDictionary="lang/userdict_ja.txt"/>
<filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt" />
<filter class="solr.JapaneseBaseFormFilterFactory"/>
<filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt"/>
<filter class="solr.CJKWidthFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt"/>
<filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1" catenateWords="1"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.JapaneseTokenizerFactory" mode="search" userDictionary="lang/userdict_ja.txt"/>
<filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.JapaneseBaseFormFilterFactory"/>
<filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt"/>
<filter class="solr.CJKWidthFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt"/>
<filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1" catenateWords="1"/>
</analyzer>
</fieldType>
当我搜索 ビームエキスパンダ 时,没有长标记,这就是它的解析方式。
"querystring":"ビームエキスパンダ",
"parsedquery":"+DisjunctionMaxQuery((((((+CategoryName_txt:ビーム +CategoryName_txt:エキス +CategoryName_txt:パンダ) CategoryName_txt:ビームエキスパンダ))~1)))",
"parsedquery_toString":"+(((((+CategoryName_txt:ビーム +CategoryName_txt:エキス +CategoryName_txt:パンダ) CategoryName_txt:ビームエキスパンダ))~1))",
当我搜索 ビームエキスパンダー 末尾有长标记时,就是这样解析的。
"querystring":"ビームエキスパンダー",
"parsedquery":"+DisjunctionMaxQuery((((CategoryName_txt:ビーム CategoryName_txt:エキスパンダ)~2)))",
"parsedquery_toString":"+(((CategoryName_txt:ビーム CategoryName_txt:エキスパンダ)~2))",
对此的任何帮助将不胜感激。
-保罗
更新 根据要求,我附上了我对这些术语的 solr 分析的屏幕截图。
To 出现在这里有问题的术语,即 Beam Expander。用破折号分析它,作为光束扩展器,这是完美的。但是,如果没有破折号,它将被分析为三个单独的单词。
作为梁的ビーム。这是对的。 但是扩展器正在被分析为术语 エキス 和 パンダ,根据谷歌翻译,这意味着提取和熊猫。
【问题讨论】:
-
查看 Web 界面的“分析”部分可能会有所帮助 - 它可以让您准确了解每个步骤的内容以及标记分解和解析的位置.
-
感谢您的评论。我已经完成了这项工作,并用屏幕截图更新了我的原始帖子。似乎 ビーム エキスパンダ,没有长破折号,正在像术语 Beam、Extract、Panda 一样被分析。
-
有没有办法修改分析的方式?