我正在尝试将中文索引和搜索到 Elasticsearch 中。通过使用 Smart Chinese Analysis (elasticsearch-analysis-smartcn) 插件,我设法搜索了简体和繁体中文的字符和单词。我试图用简体中文和繁体中文插入相同的文本,但搜索只返回一个结果(取决于搜索的执行方式);由于文本相同,我希望返回两个结果。我读过here,为了支持繁体中文,我还必须安装STConvert Analysis(elasticsearch-analysis-stconvert)插件。谁能提供一个使用这两个插件的工作示例? (或达到相同结果的替代方法)

测试索引创建为

{
   "settings":{
      "analysis":{
         "analyzer":{
            "chinese":{
               "type":"smartcn"
            }
         }
      }
   },
   "mappings":{
      "testType":{
         "properties":{
            "message":{
               "store":"yes",
               "type":"string",
               "index":"analyzed",
               "analyzer":"chinese"
            },
            "documentText": {
               "store":"compress",
               "type":"string",
               "index":"analyzed",
               "analyzer":"chinese",
               "termVector":"with_positions_offsets"
            }
         }
      }
   }
}

并且在简化繁体中具有相同文本的两个请求是
{
   "message": "汉字",
   "documentText": "制造器官的噴墨打印機 這是一種制造人體器官的裝置。這種裝置是利用打印機噴射生物 細胞、 生長激素、凝膠體,形成三維的生物活體組織。凝膠體主要是為細胞提供生長的平台,之后逐步形成所想要的器官或組織。這項技術可以人工方式制造心臟、肝臟、腎臟。這項研究已經取得了一定進展,目前正在研究如何將供應營養的血管印出來。這個創意目前已經得到了佳能等大公司的贊助"
}

{
   "message": "汉字",
   "documentText": "制造器官的喷墨打印机 这是一种制造人体器官的装置。这种装置是利用打印机喷射生物 细胞、 生长激素、凝胶体,形成叁维的生物活体组织。凝胶体主要是为细胞提供生长的平台,之后逐步形成所想要的器官或组织。这项技术可以人工方式制造心脏、肝脏、肾脏。这项研究已经取得了一定进展,目前正在研究如何将供应营养的血管印出来。这个创意目前已经得到了佳能等大公司的赞助"
}

最后,我想返回两个结果的示例搜索是
{
   "query":{
      "query_string":{
         "query":"documentText : 制造器官的喷墨打印机",
         "default_operator":"AND"
      }
   }
}

最佳答案

经过多次尝试,我找到了一个有效的配置。我没有设法使 smartcn 与 stconvert 插件一起工作,所以我使用了 elasticsearch 的 cjk 分析器,并添加了 icu_tokenizer。通过使用 t2s 和 s2t 作为过滤器,每个字符都以繁体和简体两种形式存储。

{
   "settings":{
      "analysis":{
        "filter": {
          "english_stop": {
            "type":       "stop",
            "stopwords":  "_english_"
          },
          "t2s_convert": {
            "type": "stconvert",
            "delimiter": ",",
            "convert_type": "t2s"
          },
          "s2t_convert": {
            "type": "stconvert",
            "delimiter": ",",
            "convert_type": "s2t"
          }
        },
        "analyzer": {
          "my_cjk": {
            "tokenizer": "icu_tokenizer",
            "filter": [
              "cjk_width",
              "lowercase",
              "cjk_bigram",
              "english_stop",
              "t2s_convert",
              "s2t_convert"
            ]
          }
        }
      }
   },
   "mappings":{
      "testType":{
         "properties":{
            "message":{
               "store":"yes",
               "type":"string",
               "index":"analyzed",
               "analyzer":"my_cjk"
            },
            "documentText": {
               "store":"compress",
               "type":"string",
               "index":"analyzed",
               "analyzer":"my_cjk",
               "termVector":"with_positions_offsets"
            }
         }
      }
   }
}

关于Elasticsearch 支持繁体中文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31435511/

10-11 08:51