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 并进行较少的优化。

谢谢大家的帮助。

-保罗