【问题标题】:Solr - Japanese and long vowel marksSolr - 日语和长元音标记
【发布时间】: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 一样被分析。
  • 有没有办法修改分析的方式?

标签: solr solrnet cjk


【解决方案1】:

我发现了这个问题。我不是日语专家,但据我所知,关于日语的一件有趣的事情是,他们不使用空格来描述单词的结尾。 BeamSplitter 和日语中的 BeamExtractPanda 这两个词本质上是同一个词,而 solr 只是尽力确定在哪里拆分单词。

这就是用户词典的用武之地。对我来说,这个文件位于默认位置 lang/userdict_ja.txt。

我在下面添加了一行.. ビームエキスパンダ,ビーム エキスパンダ,ビーム エキスパンダ, 扩束器

我可能对此有误,但据我所知,这里的第一列应该是正在搜索的错误词,第二列和第三列应该是同一个词,但有一个空格表示应该在哪里分段通过分词器。

我认为这样的情况是不寻常的,所以我可以解决这个问题,并且宁愿保留 JapaneseTokenizerFactory 并放入边缘情况,而不是使用 standardTokenizerFactory 并进行较少优化。

感谢大家的帮助。

-保罗

【讨论】:

    【解决方案2】:

    我想知道您是否需要在索引和查询分析器中使用solr.CJKBigramFilterFactory。在普通的 Solr 7 中,我在 text_cjk 字段上得到了预期的结果(即它找到了有或没有长标记的匹配项)。见下图:

    以下是此 Solr 中 text_cjk 字段的定义方式:

    $ 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"}]}}}
    

    【讨论】:

    • 如果我这样做,当我对其他热门搜索词进行分析时,我认为 text_cjk 往往排名较低,因为它不使用 JapaneseTokenizerFactory。我认为对于这个特定的术语,它可能更有价值,但对于大多数其他术语而言,它不是。
    猜你喜欢
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    相关资源
    最近更新 更多