Solr - 日语和长元音标记
Solr - Japanese and long vowel marks
所以我遇到了一个有趣的问题。我正在尝试针对日文字符优化我在日本的 solr 索引。
本质上,问题在于 Solr 无法识别带有长标记和没有长标记的词是同一个词。我不懂日语,但我正在和懂日语的人一起工作,他们告诉我,当你搜索 biーmuエキスパンドー 时,它 return 的结果是应该的。
但是如果你搜索biーmuエキスパンド,这是同一个词,但减去末尾的长标记,它不会return任何结果。我们被索引的内容都包含biーmuエキスパンドー,但是我们本质上想要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>
我搜索biーmuエキスパンド时,没有长标记,是这样解析的。
"querystring":"ビームエキスパンダ",
"parsedquery":"+DisjunctionMaxQuery((((((+CategoryName_txt:ビーム +CategoryName_txt:エキス +CategoryName_txt:パンダ) CategoryName_txt:ビームエキスパンダ))~1)))",
"parsedquery_toString":"+(((((+CategoryName_txt:ビーム +CategoryName_txt:エキス +CategoryName_txt:パンダ) CategoryName_txt:ビームエキスパンダ))~1))",
当我搜索末尾有长标记的biーmuエキスパンドー时,是这样解析的。
"querystring":"ビームエキスパンダー",
"parsedquery":"+DisjunctionMaxQuery((((CategoryName_txt:ビーム CategoryName_txt:エキスパンダ)~2)))",
"parsedquery_toString":"+(((CategoryName_txt:ビーム CategoryName_txt:エキスパンダ)~2))",
如有任何帮助,我们将不胜感激。
-保罗
更新
根据要求,我附上了我对这些条款的 solr 分析的屏幕截图。
没有长破折号
带长破折号
这里出现了有问题的术语,即扩束器。它被破折号分析,作为扩束器,这是完美的。虽然没有破折号,但它被分析为三个单独的词。
biーmu 也就是光束。这是对的。
但是 expander 正在被分析为 エキス 和 パンド,根据 Google 翻译,这意味着 Extract 和 Panda。
我想知道您是否需要在索引和查询分析器中使用 solr.CJKBigramFilterFactory
。在普通的香草 Solr 7 中,我在 text_cjk
字段上得到了预期的结果(即它找到了有或没有长标记的匹配项)。见下图:
下面是 text_cjk
字段在此 Solr 中的定义方式:
$ curl http://localhost:8983/solr/cjktest/schema/fieldtypes/text_cjk
{
"responseHeader":{
"status":0,
"QTime":1},
"fieldType":{
"name":"text_cjk",
"class":"solr.TextField",
"positionIncrementGap":"100",
"analyzer":{
"tokenizer":{
"class":"solr.StandardTokenizerFactory"},
"filters":[{
"class":"solr.CJKWidthFilterFactory"},
{
"class":"solr.LowerCaseFilterFactory"},
{
"class":"solr.CJKBigramFilterFactory"}]}}}
我想通了这个问题。我不是日语专家,但据我所知,关于日语的一件有趣的事情是,他们不使用 spaces 来划定单词的结尾。短语 BeamSplitter 和日语中的 BeamExtractPanda 本质上是同一个词,而 solr 只是试图最好地确定在哪里分解这些词。
这就是用户词典的用武之地。我的这个文件位于默认位置,lang/userdict_ja.txt。
我在下面添加了这行..
biーmuエキスパンド,biーmu エキスパンド,biーmu エキスパンド,扩束镜
我可能错了,但据我所知,这里的第一列应该是搜索错误的词,第二列和第三列应该是同一个词,但带有 space指示分词器应在何处对其进行分段。
我相信像这样的情况并不常见,所以我认为这是一种解决方法,我宁愿保留 JapaneseTokenizerFactory 并放在边缘情况下,也不愿使用 standardTokenizerFactory 并进行较少的优化。
谢谢大家的帮助。
-保罗
所以我遇到了一个有趣的问题。我正在尝试针对日文字符优化我在日本的 solr 索引。
本质上,问题在于 Solr 无法识别带有长标记和没有长标记的词是同一个词。我不懂日语,但我正在和懂日语的人一起工作,他们告诉我,当你搜索 biーmuエキスパンドー 时,它 return 的结果是应该的。
但是如果你搜索biーmuエキスパンド,这是同一个词,但减去末尾的长标记,它不会return任何结果。我们被索引的内容都包含biーmuエキスパンドー,但是我们本质上想要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>
我搜索biーmuエキスパンド时,没有长标记,是这样解析的。
"querystring":"ビームエキスパンダ",
"parsedquery":"+DisjunctionMaxQuery((((((+CategoryName_txt:ビーム +CategoryName_txt:エキス +CategoryName_txt:パンダ) CategoryName_txt:ビームエキスパンダ))~1)))",
"parsedquery_toString":"+(((((+CategoryName_txt:ビーム +CategoryName_txt:エキス +CategoryName_txt:パンダ) CategoryName_txt:ビームエキスパンダ))~1))",
当我搜索末尾有长标记的biーmuエキスパンドー时,是这样解析的。
"querystring":"ビームエキスパンダー",
"parsedquery":"+DisjunctionMaxQuery((((CategoryName_txt:ビーム CategoryName_txt:エキスパンダ)~2)))",
"parsedquery_toString":"+(((CategoryName_txt:ビーム CategoryName_txt:エキスパンダ)~2))",
如有任何帮助,我们将不胜感激。
-保罗
更新 根据要求,我附上了我对这些条款的 solr 分析的屏幕截图。
没有长破折号
带长破折号
这里出现了有问题的术语,即扩束器。它被破折号分析,作为扩束器,这是完美的。虽然没有破折号,但它被分析为三个单独的词。
biーmu 也就是光束。这是对的。 但是 expander 正在被分析为 エキス 和 パンド,根据 Google 翻译,这意味着 Extract 和 Panda。
我想知道您是否需要在索引和查询分析器中使用 solr.CJKBigramFilterFactory
。在普通的香草 Solr 7 中,我在 text_cjk
字段上得到了预期的结果(即它找到了有或没有长标记的匹配项)。见下图:
下面是 text_cjk
字段在此 Solr 中的定义方式:
$ curl http://localhost:8983/solr/cjktest/schema/fieldtypes/text_cjk
{
"responseHeader":{
"status":0,
"QTime":1},
"fieldType":{
"name":"text_cjk",
"class":"solr.TextField",
"positionIncrementGap":"100",
"analyzer":{
"tokenizer":{
"class":"solr.StandardTokenizerFactory"},
"filters":[{
"class":"solr.CJKWidthFilterFactory"},
{
"class":"solr.LowerCaseFilterFactory"},
{
"class":"solr.CJKBigramFilterFactory"}]}}}
我想通了这个问题。我不是日语专家,但据我所知,关于日语的一件有趣的事情是,他们不使用 spaces 来划定单词的结尾。短语 BeamSplitter 和日语中的 BeamExtractPanda 本质上是同一个词,而 solr 只是试图最好地确定在哪里分解这些词。
这就是用户词典的用武之地。我的这个文件位于默认位置,lang/userdict_ja.txt。
我在下面添加了这行.. biーmuエキスパンド,biーmu エキスパンド,biーmu エキスパンド,扩束镜
我可能错了,但据我所知,这里的第一列应该是搜索错误的词,第二列和第三列应该是同一个词,但带有 space指示分词器应在何处对其进行分段。
我相信像这样的情况并不常见,所以我认为这是一种解决方法,我宁愿保留 JapaneseTokenizerFactory 并放在边缘情况下,也不愿使用 standardTokenizerFactory 并进行较少的优化。
谢谢大家的帮助。
-保罗