中文搜索

共有 92 个国家和地区的代表队参加了去年的平昌冬奥会。 共有 49 个国家和地区的代表队参加了去年的平昌冬季残奥会。 Elastic 的员工遍布全球 34 个国家/地区。 在很多国家/地区内,很多人都会使用自己的母语撰写邮件。 现在,您希望通过韩语关键字“올림픽대회”来搜索一封邮件。

https://www.elastic.co/guide/en/elasticsearch/guide/current/language-intro.html 对处理以多种语言编写的文档时会遇到的问题进行了说明,但其中所使用的示例大部分均为欧洲语言,也无需任何任何自定义插件。 本文介绍了适用于韩文、日文和中文的自定义插件(语言分析工具),并且介绍了一种使用多字段来对多语言文本进行索引和查询的方法。

标准分析工具: 默认分析工具

需要使用语言分析工具方能进行全文本搜索。 默认情况下,均采用标准分析工具,然而其可能并非最佳选择,对中文、日文和韩文文本来说,尤为如此。 我们在下面分别针对韩文、日文和中文提供了标准分析工具的应用示例。这些文字是关于平昌奥运会的节选。

韩文

POST _analyze



{



  "analyzer": "standard",



  "text": "제23회 동계올림픽대회는 대한민국 강원도 평창에서 2018년 2월 9일부터 25일까지 17일간 개최됩니다. 대한민국 평창은 세 번의 도전 끝에 지난 2011년 7월 6일 열린 제123차 IOC 총회에서 과반 표를 획득하며 2018년 동계올림픽 개최지로 선정되었습니다. 이로써 대한민국에서는 1988년 서울 올림픽 이후 30년 만에, 평창에서 개∙폐회식과 대부분의 설상 경기가 개최되며, 강릉에서는 빙상 종목 전 경기가, 그리고 정선에서는 알파인 스키 활강 경기가 개최될 예정입니다."



}



=>



{



  "tokens": [



    {



      "token": "제23회",



      "start_offset": 0,



      "end_offset": 4,



      "type": "<ALPHANUM>",



      "position": 0



    },



    {



      "token": "동계올림픽대회는",



      "start_offset": 5,



      "end_offset": 13,



      "type": "<HANGUL>",



      "position": 1



    },



…
韩语是一种黏着性语言,名词(例如“동계올림픽대회”)后面通常都跟有后置词(例如“는”)。 若要实现更佳的搜索效果,应当将后置词分隔开来或者将其删掉,但是标准分析工具却无法做到这一点,因为它会将名词与后置词作为一个整体来看待。

日文

POST _analyze



{



  "analyzer": "standard",



  "text": "第23回冬季オリンピック大会は大韓民国江原道平昌で2018年2月9日から25日までの17日間、開催されます。大韓民国・平昌は三度の挑戦の末、2011年7月7日に開かれた第123回IOC総会で過半数票を獲得し、2018年冬季オリンピック及びパラリンピックの開催地に選ばれました。これにより1988年ソウルオリンピック開催後30年の時を経てついに、大韓民国で最初の冬季パラリンピックの舞台が繰り広げられます。平昌で開・閉会式とほぼ全ての雪上競技が開催され、江陵では氷上種目全競技が、そして旌善ではアルペンスキー滑降競技が開催される予定です。"



}



=>



{



  "tokens": [



    {



      "token": "第",



      "start_offset": 0,



      "end_offset": 1,



      "type": "<IDEOGRAPHIC>",



      "position": 0



    },



    {



      "token": "23",



      "start_offset": 1,



      "end_offset": 3,



      "type": "<NUM>",



      "position": 1



    },



    {



      "token": "回",



      "start_offset": 3,



      "end_offset": 4,



      "type": "<IDEOGRAPHIC>",



      "position": 2



    },



    {



      "token": "冬",



      "start_offset": 4,



      "end_offset": 5,



      "type": "<IDEOGRAPHIC>",



      "position": 3



    },



    {



      "token": "季",



      "start_offset": 5,



      "end_offset": 6,



      "type": "<IDEOGRAPHIC>",



      "position": 4



    },



    {



      "token": "オリンピック",



      "start_offset": 6,



      "end_offset": 12,



      "type": "<KATAKANA>",



      "position": 5



    },



    {



      "token": "大",



      "start_offset": 12,



      "end_offset": 13,



      "type": "<IDEOGRAPHIC>",



      "position": 6



    },



    {



      "token": "会",



      "start_offset": 13,



      "end_offset": 14,



      "type": "<IDEOGRAPHIC>",



      "position": 7



    },



    {



      "token": "は",



      "start_offset": 14,



      "end_offset": 15,



      "type": "<HIRAGANA>",



      "position": 8



    },



…
日语也是一种黏着性语言,名词(例如“冬季オリンピック大会”)后面通常都跟有后置词(例如“は”)。 同理,若要实现更佳的搜索效果,应当将后置词分隔开来或者将其删掉,但是标准分析工具却无法做到这一点,因为它会将名词与后置词作为一个整体来看待。 更糟的是,日语名词形式不一,有的为日文汉字,有的为假名,但是标准分析工具却会将每个日文汉字字符作为一个单独的符号。

中文

POST _analyze



{



  "analyzer": "standard",



  "text": "第23届冬季奥运会将于2018年2月9日-25日在韩国江原道平昌展开。韩国平昌在第三次申奥之后,于2011年7月6日召开的第123届国际奥委会全会上被选定为2018年冬季奥运会的主办地。由此,韩国自1988年举办首尔夏季奥运会以后,时隔30年,将首次举办冬季奥运会。该届冬奥会的开·闭幕式以及大部分的雪上运动将在平昌进行,而所有冰上运动将在江陵、高山滑雪滑降比赛则将在旌善进行。"



}



=>



{



  "tokens": [



    {



      "token": "第",



      "start_offset": 0,



      "end_offset": 1,



      "type": "<IDEOGRAPHIC>",



      "position": 0



    },



    {



      "token": "23",



      "start_offset": 1,



      "end_offset": 3,



      "type": "<NUM>",



      "position": 1



    },



    {



      "token": "届",



      "start_offset": 3,



      "end_offset": 4,



      "type": "<IDEOGRAPHIC>",



      "position": 2



    },



    {



      "token": "冬",



      "start_offset": 4,



      "end_offset": 5,



      "type": "<IDEOGRAPHIC>",



      "position": 3



    },



    {



      "token": "季",



      "start_offset": 5,



      "end_offset": 6,



      "type": "<IDEOGRAPHIC>",



      "position": 4



    },



    {



      "token": "奥",



      "start_offset": 6,



      "end_offset": 7,



      "type": "<IDEOGRAPHIC>",



      "position": 5



    },



    {



      "token": "运",



      "start_offset": 7,



      "end_offset": 8,



      "type": "<IDEOGRAPHIC>",



      "position": 6



    },



    {



      "token": "会",



      "start_offset": 8,



      "end_offset": 9,



      "type": "<IDEOGRAPHIC>",



      "position": 7



    },



...
同理,标准分析工具并不知道“冬季奥运会”的具体含义,会将所有字符分割开来,而不会将其视为一个整体。

针对具体语言的分析工具: 自定义插件

借助适用于具体语言的分析工具,我们可以获得更佳的搜索体验。 日文、中文和韩文的热门分析工具分别是 kuromojismartcnopenkoreantext-analyzer。 您首先必须在每个节点上安装这些插件,然后才能运行下列示例。 请注意:由于 openkoreantext-analyzer 未在 Elastic 仓库中进行托管,所以您必须使用完整的 URL,或者首先将其下载下来并进行安装。

韩文

POST _analyze



{



  "analyzer": "openkoreantext-analyzer",



  "text": "제23회 동계올림픽대회는 대한민국 강원도 평창에서 2018년 2월 9일부터 25일까지 17일간 개최됩니다. 대한민국 평창은 세 번의 도전 끝에 지난 2011년 7월 6일 열린 제123차 IOC 총회에서 과반 표를 획득하며 2018년 동계올림픽 개최지로 선정되었습니다. 이로써 대한민국에서는 1988년 서울 올림픽 이후 30년 만에, 평창에서 개∙폐회식과 대부분의 설상 경기가 개최되며, 강릉에서는 빙상 종목 전 경기가, 그리고 정선에서는 알파인 스키 활강 경기가 개최될 예정입니다."



}



=>



{



  "tokens": [



    {



      "token": "제",



      "start_offset": 0,



      "end_offset": 1,



      "type": "Noun",



      "position": 0



    },



    {



      "token": "23회",



      "start_offset": 1,



      "end_offset": 4,



      "type": "Number",



      "position": 1



    },



    {



      "token": "동계올림픽",



      "start_offset": 5,



      "end_offset": 10,



      "type": "Noun",



      "position": 2



    },



    {



      "token": "대회",



      "start_offset": 10,



      "end_offset": 12,



      "type": "Noun",



      "position": 3



    },



...

现在,您可以看到所有后置词均已删除。

日文

POST _analyze



{



  "analyzer": "kuromoji",



  "text": "第23回冬季オリンピック大会は大韓民国江原道平昌で2018年2月9日から25日までの17日間、開催されます。大韓民国・平昌は三度の挑戦の末、2011年7月7日に開かれた第123回IOC総会で過半数票を獲得し、2018年冬季オリンピック及びパラリンピックの開催地に選ばれました。これにより1988年ソウルオリンピック開催後30年の時を経てついに、大韓民国で最初の冬季パラリンピックの舞台が繰り広げられます。平昌で開・閉会式とほぼ全ての雪上競技が開催され、江陵では氷上種目全競技が、そして旌善ではアルペンスキー滑降競技が開催される予定です。"



}



=>



{



  "tokens": [



    {



      "token": "第",



      "start_offset": 0,



      "end_offset": 1,



      "type": "word",



      "position": 0



    },



    {



      "token": "23",



      "start_offset": 1,



      "end_offset": 3,



      "type": "word",



      "position": 1



    },



    {



      "token": "回",



      "start_offset": 3,



      "end_offset": 4,



      "type": "word",



      "position": 2



    },



    {



      "token": "冬季",



      "start_offset": 4,



      "end_offset": 6,



      "type": "word",



      "position": 3



    },



    {



      "token": "オリンピック",



      "start_offset": 6,



      "end_offset": 12,



      "type": "word",



      "position": 4



    },



    {



      "token": "大会",



      "start_offset": 12,



      "end_offset": 14,



      "type": "word",



      "position": 5



    },



...
所有后置词均已删掉,并且日文汉字并未被分解得支离破碎。

中文

POST _analyze



{



  "analyzer": "smartcn",



  "text": "第23届冬季奥运会将于2018年2月9日-25日在韩国江原道平昌展开。韩国平昌在第三次申奥之后,于2011年7月6日召开的第123届国际奥委会全会上被选定为2018年冬季奥运会的主办地。由此,韩国自1988年举办首尔夏季奥运会以后,时隔30年,将首次举办冬季奥运会。该届冬奥会的开·闭幕式以及大部分的雪上运动将在平昌进行,而所有冰上运动将在江陵、高山滑雪滑降比赛则将在旌善进行。"



}



=>



{



  "tokens": [



    {



      "token": "第",



      "start_offset": 0,



      "end_offset": 1,



      "type": "word",



      "position": 0



    },



    {



      "token": "23",



      "start_offset": 1,



      "end_offset": 3,



      "type": "word",



      "position": 1



    },



    {



      "token": "届",



      "start_offset": 3,



      "end_offset": 4,



      "type": "word",



      "position": 2



    },



    {



      "token": "冬季",



      "start_offset": 4,



      "end_offset": 6,



      "type": "word",



      "position": 3



    },



    {



      "token": "奥运会",



      "start_offset": 6,



      "end_offset": 9,



      "type": "word",



      "position": 4



    },



...

您现在可以看到组成词语的各个汉字仍在一起,并未被继续分解。

使用标准分析工具,索引至单字段

基本来说,我们可以使用标准分析工具将任何语言的文本索引至单一字段。

DELETE mono



PUT /mono



{  



  "mappings": {



    "docs": {



      "properties": {



        "body": {



          "type": "text"



        }



      }



    }



  }



}
PUT /mono/docs/1 



{



  "body" : "세계인의 축제, 제23회 동계올림픽대회는 대한민국 강원도 평창에서 2018년 2월 9일부터 25일까지 17일간 개최됩니다. 대한민국 평창은 세 번의 도전 끝에 지난 2011년 7월 6일 열린 제123차 IOC 총회에서 과반 표를 획득하며 2018년 동계올림픽 개최지로 선정되었습니다. 이로써 대한민국에서는 1988년 서울 올림픽 이후 30년 만에, 평창에서 개∙폐회식과 대부분의 설상 경기가 개최되며, 강릉에서는 빙상 종목 전 경기가, 그리고 정선에서는 알파인 스키 활강 경기가 개최될 예정입니다."



}



PUT /mono/docs/2 



{



  "body" : "The XXIII Olympic Winter Games will be held for 17 days from 9 to 25 February 2018 in PyeongChang, Gangwon Province, the Republic of Korea. PyeongChang was selected as the host city of the 2018 Olympic Winter Games after receiving a majority vote at the 123rd IOC Session held on 6 July 2011 after three consecutive bids. The Olympic Winter Games will be held in Korea for the first time in 30 years after the Seoul Olympic Games in 1988. PyeongChang will be the stage for the Opening and Closing Ceremonies and most snow sports. Alpine speed events will take place in Jeongseon, and all ice sports will be competed in the coastal city of Gangneung."



}



PUT /mono/docs/3



{



  "body" : "第23届冬季奥运会将于2018年2月9日-25日在韩国江原道平昌展开。韩国平昌在第三次申奥之后,于2011年7月6日召开的第123届国际奥委会全会上被选定为2018年冬季奥运会的主办地。由此,韩国自1988年举办首尔夏季奥运会以后,时隔30年,将首次举办冬季奥运会。该届冬奥会的开·闭幕式以及大部分的雪上运动将在平昌进行,而所有冰上运动将在江陵、高山滑雪滑降比赛则将在旌善进行。"}PUT /mono/docs/4{  "body" : "世界の人々の祝祭、第23回冬季オリンピック大会は大韓民国江原道平昌で2018年2月9日から25日までの17日間、開催されます。大韓民国・平昌は三度の挑戦の末、2011年7月7日に開かれた第123回IOC総会で過半数票を獲得し、2018年冬季オリンピック及びパラリンピックの開催地に選ばれました。これにより1988年ソウルオリンピック開催後30年の時を経てついに、大韓民国で最初の冬季パラリンピックの舞台が繰り広げられます。平昌で開・閉会式とほぼ全ての雪上競技が開催され、江陵では氷上種目全競技が、そして旌善ではアルペンスキー滑降競技が開催される予定です。"



}

这一方法有时奏效,有时则不然。 日语和韩语中有后置词,所以这一问题就尤为明显。 如果分析工具不能将后置词与名词区分开来,则搜索可能就无法正常进行。

[英语]

GET /mono/_search



{



  "query": {



    "multi_match": {



      "query": "Olympic Games",



      "fields": [



        "body"



      ]



    }



  }



}



=>



{



 ...



  "hits": {



    "total": 1,



    "max_score": 2.3414338,



    "hits": [



      {



        "_index": "mono",



        "_type": "docs",



        "_id": "2",



        "_score": 2.3414338,



        "_source": {



          "body": "The XXIII Olympic Winter Games will be held for 17 days from 9 to 25 February 2018 in PyeongChang, Gangwon Province, the Republic of Korea. PyeongChang was selected as the host city of the 2018 Olympic Winter Games after receiving a majority vote at the 123rd IOC Session held on 6 July 2011 after three consecutive bids. The Olympic Winter Games will be held in Korea for the first time in 30 years after the Seoul Olympic Games in 1988. PyeongChang will be the stage for the Opening and Closing Ceremonies and most snow sports. Alpine speed events will take place in Jeongseon, and all ice sports will be competed in the coastal city of Gangneung."



        }



      }



    ]



  }



}
 

[日文]

POST /mono/_search



{



  "query": {



    "multi_match": {



      "query": "オリンピック大会",



      "fields": [



        "body"



      ]



    }



  }



}



=>



{



...



  "hits": {



    "total": 2,



    "max_score": 2.8541033,



    "hits": [



      {



        "_index": "mono",



        "_type": "docs",



        "_id": "4",



        "_score": 2.8541033,



        "_source": {



          "body": "世界の人々の祝祭、第23回冬季オリンピック大会は大韓民国江原道平昌で2018年2月9日から25日までの17日間、開催されます。大韓民国・平昌は三度の挑戦の末、2011年7月7日に開かれた第123回IOC総会で過半数票を獲得し、2018年冬季オリンピック及びパラリンピックの開催地に選ばれました。これにより1988年ソウルオリンピック開催後30年の時を経てついに、大韓民国で最初の冬季パラリンピックの舞台が繰り広げられます。平昌で開・閉会式とほぼ全ての雪上競技が開催され、江陵では氷上種目全競技が、そして旌善ではアルペンスキー滑降競技が開催される予定です。"



        }



      },



      {



        "_index": "mono",



        "_type": "docs",



        "_id": "3",



        "_score": 0.82374656,



        "_source": {



          "body": "第23届冬季奥运会将于2018年2月9日-25日在韩国江原道平昌展开。韩国平昌在第三次申奥之后,于2011年7月6日召开的第123届国际奥委会全会上被选定为2018年冬季奥运会的主办地。由此,韩国自1988年举办首尔夏季奥运会以后,时隔30年,将首次举办冬季奥运会。该届冬奥会的开·闭幕式以及大部分的雪上运动将在平昌进行,而所有冰上运动将在江陵、高山滑雪滑降比赛则将在旌善进行。"          }



      }



    ]



  }



}

[中文]

POST /mono/_search



{



  "query": {



    "multi_match": {



      "query": "奥运会",



      "fields": [



        "body"



      ]



    }



  }



}



=>



{



...



  "hits": {



    "total": 2,



    "max_score": 1.6035628,



    "hits": [



      {



        "_index": "mono",



        "_type": "docs",



        "_id": "3",



        "_score": 1.6035628,



        "_source": {



          "body": "第23届冬季奥运会将于2018年2月9日-25日在韩国江原道平昌展开。韩国平昌在第三次申奥之后,于2011年7月6日召开的第123届国际奥委会全会上被选定为2018年冬季奥运会的主办地。由此,韩国自1988年举办首尔夏季奥运会以后,时隔30年,将首次举办冬季奥运会。该届冬奥会的开·闭幕式以及大部分的雪上运动将在平昌进行,而所有冰上运动将在江陵、高山滑雪滑降比赛则将在旌善进行。"



        }



      },



      {



        "_index": "mono",



        "_type": "docs",



        "_id": "4",



        "_score": 0.9687751,



        "_source": {



          "body": "世界の人々の祝祭、第23回冬季オリンピック大会は大韓民国江原道平昌で2018年2月9日から25日までの17日間、開催されます。大韓民国・平昌は三度の挑戦の末、2011年7月7日に開かれた第123回IOC総会で過半数票を獲得し、2018年冬季オリンピック及びパラリンピックの開催地に選ばれました。これにより1988年ソウルオリンピック開催後30年の時を経てついに、大韓民国で最初の冬季パラリンピックの舞台が繰り広げられます。平昌で開・閉会式とほぼ全ての雪上競技が開催され、江陵では氷上種目全競技が、そして旌善ではアルペンスキー滑降競技が開催される予定です。"



        }



      }



    ]



  }



}
 

[韩文]

POST /mono/_search



{



  "query": {



    "multi_match": {



      "query": "올림픽대회",



      "fields": [



        "body"



      ]



    }



  }



}



=>



{



...



  "hits": {



    "total": 0,



    "max_score": null,



    "hits": []



  }



}

您可以看到,英文、日文和中文查询都返回了结果,而韩文查询则未能返回结果。 英文是一种屈折性语言,并没有后置词,所以可以使用标准分析工具进行处理。 日文是一种黏着性语言,但是标准分析工具可以将日文汉字(“大”、“会”)、平假名(“は”)和片假名(“オリンピック”)分离开来(您可以参阅“标准分析工具: 默认分析工具”,链接为 https://www.elastic.co/blog/how-to-search-ch-jp-kr…) ,而且 Elasticsearch 仍可以找到文档(”_id”: “4”, “_score”: 2.8541033). 中文文档 (”_id”: “3”) 匹配上了“会”字,所以也包括在了较低分数(0.82374656)的搜索结果中。

使用针对具体语言的分析工具,索引至多字段

我们可以针对多种语言定义多个字段,并且为每个子字段分别设定分析工具。 您应当针对日文、中文和韩文分别安装 kuromoji, smartcn, 和 openkoreantext-analyzer

DELETE /test



PUT /test



{



  "mappings": {



    "docs": {



      "properties": {



        "body": {



          "type": "text",



          "fields": {



            "korean_field": {



              "analyzer": "openkoreantext-analyzer",



              "type": "text"



            },



            "japanese_field": {



              "analyzer": "kuromoji",



              "type": "text"



            },



            "chinese_field": {



              "analyzer": "smartcn",



              "type": "text"



            }



          }



        }



      }



    }



  }



}

如果我们对文本进行索引,4 款分析工具会同时对此文本进行分析,其中也包括主要用于 “body” 字段的标准分析工具。

PUT /test/docs/1



{



  "body" : "세계인의 축제, 제23회 동계올림픽대회는 대한민국 강원도 평창에서 2018년 2월 9일부터 25일까지 17일간 개최됩니다. 대한민국 평창은 세 번의 도전 끝에 지난 2011년 7월 6일 열린 제123차 IOC 총회에서 과반 표를 획득하며 2018년 동계올림픽 개최지로 선정되었습니다. 이로써 대한민국에서는 1988년 서울 올림픽 이후 30년 만에, 평창에서 개∙폐회식과 대부분의 설상 경기가 개최되며, 강릉에서는 빙상 종목 전 경기가, 그리고 정선에서는 알파인 스키 활강 경기가 개최될 예정입니다."



}



PUT /test/docs/2



{



  "body" : "The XXIII Olympic Winter Games will be held for 17 days from 9 to 25 February 2018 in PyeongChang, Gangwon Province, the Republic of Korea. PyeongChang was selected as the host city of the 2018 Olympic Winter Games after receiving a majority vote at the 123rd IOC Session held on 6 July 2011 after three consecutive bids. The Olympic Winter Games will be held in Korea for the first time in 30 years after the Seoul Olympic Games in 1988. PyeongChang will be the stage for the Opening and Closing Ceremonies and most snow sports. Alpine speed events will take place in Jeongseon, and all ice sports will be competed in the coastal city of Gangneung."



}



PUT /test/docs/3



{



  "body" : "第23届冬季奥运会将于2018年2月9日-25日在韩国江原道平昌展开。韩国平昌在第三次申奥之后,于2011年7月6日召开的第123届国际奥委会全会上被选定为2018年冬季奥运会的主办地。由此,韩国自1988年举办首尔夏季奥运会以后,时隔30年,将首次举办冬季奥运会。该届冬奥会的开·闭幕式以及大部分的雪上运动将在平昌进行,而所有冰上运动将在江陵、高山滑雪滑降比赛则将在旌善进行。"



}



PUT /test/docs/4



{



  "body" : "世界の人々の祝祭、第23回冬季オリンピック大会は大韓民国江原道平昌で2018年2月9日から25日までの17日間、開催されます。大韓民国・平昌は三度の挑戦の末、2011年7月7日に開かれた第123回IOC総会で過半数票を獲得し、2018年冬季オリンピック及びパラリンピックの開催地に選ばれました。これにより1988年ソウルオリンピック開催後30年の時を経てついに、大韓民国で最初の冬季パラリンピックの舞台が繰り広げられます。平昌で開・閉会式とほぼ全ての雪上競技が開催され、江陵では氷上種目全競技が、そして旌善ではアルペンスキー滑降競技が開催される予定です。"



}

由于我们可以使用 multi_match 查询,所以主字段(英语)或针对具体语言的子字段会进行匹配。

[韩文]

POST /test/_search



{



  "query": {



    "multi_match": {



      "query": "올림픽대회",



      "fields": [



        "body",



        "body.korean_field",



        "body.chinese_field",



        "body.japanese_field"



      ]



    }



  }



}



=>



{



...



  "hits": {



    "total": 1,



    "max_score": 2.207397,



    "hits": [



      {



        "_index": "test",



        "_type": "docs",



        "_id": "1",



        "_score": 2.207397,



        "_source": {



          "body": "세계인의 축제, 제23회 동계올림픽대회는 대한민국 강원도 평창에서 2018년 2월 9일부터 25일까지 17일간 개최됩니다. 대한민국 평창은 세 번의 도전 끝에 지난 2011년 7월 6일 열린 제123차 IOC 총회에서 과반 표를 획득하며 2018년 동계올림픽 개최지로 선정되었습니다. 이로써 대한민국에서는 1988년 서울 올림픽 이후 30년 만에, 평창에서 개∙폐회식과 대부분의 설상 경기가 개최되며, 강릉에서는 빙상 종목 전 경기가, 그리고 정선에서는 알파인 스키 활강 경기가 개최될 예정입니다."



        }



      }



    ]



  }



}
 

[英语]

POST /test/_search



{



  "query": {



    "multi_match": {



      "query": "Olympic Games",



      "fields": [



        "body",



        "body.korean_field",



        "body.chinese_field",



        "body.japanese_field"



      ]



    }



  }



}



=>



{



...



  "hits": {



    "total": 1,



    "max_score": 2.3665998,



    "hits": [



      {



        "_index": "test",



        "_type": "docs",



        "_id": "2",



        "_score": 2.3665998,



        "_source": {



          "body": "The XXIII Olympic Winter Games will be held for 17 days from 9 to 25 February 2018 in PyeongChang, Gangwon Province, the Republic of Korea. PyeongChang was selected as the host city of the 2018 Olympic Winter Games after receiving a majority vote at the 123rd IOC Session held on 6 July 2011 after three consecutive bids. The Olympic Winter Games will be held in Korea for the first time in 30 years after the Seoul Olympic Games in 1988. PyeongChang will be the stage for the Opening and Closing Ceremonies and most snow sports. Alpine speed events will take place in Jeongseon, and all ice sports will be competed in the coastal city of Gangneung."



        }



      }



    ]



  }



}
日文和中文文本都可能会包含汉字,所以查询可能会返回两种文本。 您既可以显示所有结果,也可以挑选分数最高的结果。

[日语]

POST /test/_search



{



  "query": {



    "multi_match": {



      "query": "オリンピック大会",



      "fields": [



        "body",



        "body.korean_field",



        "body.chinese_field",



        "body.japanese_field"



      ]



    }



  }



}



=>



{



...



  "hits": {



    "total": 2,



    "max_score": 7.3598623,



    "hits": [



      {



        "_index": "test",



        "_type": "docs",



        "_id": "4",



        "_score": 7.3598623,



        "_source": {



          "body": "世界の人々の祝祭、第23回冬季オリンピック大会は大韓民国江原道平昌で2018年2月9日から25日までの17日間、開催されます。大韓民国・平昌は三度の挑戦の末、2011年7月7日に開かれた第123回IOC総会で過半数票を獲得し、2018年冬季オリンピック及びパラリンピックの開催地に選ばれました。これにより1988年ソウルオリンピック開催後30年の時を経てついに、大韓民国で最初の冬季パラリンピックの舞台が繰り広げられます。平昌で開・閉会式とほぼ全ての雪上競技が開催され、江陵では氷上種目全競技が、そして旌善ではアルペンスキー滑降競技が開催される予定です。"



        }



      },



      {



        "_index": "test",



        "_type": "docs",



        "_id": "3",



        "_score": 0.82374656,



        "_source": {



          "body": "第23届冬季奥运会将于2018年2月9日-25日在韩国江原道平昌展开。韩国平昌在第三次申奥之后,于2011年7月6日召开的第123届国际奥委会全会上被选定为2018年冬季奥运会的主办地。由此,韩国自1988年举办首尔夏季奥运会以后,时隔30年,将首次举办冬季奥运会。该届冬奥会的开·闭幕式以及大部分的雪上运动将在平昌进行,而所有冰上运动将在江陵、高山滑雪滑降比赛则将在旌善进行。"



        }



      }



    ]



  }



}
 

[中文]

POST /test/_search



{



  "query": {



    "multi_match": {



      "query": "奥运会",



      "fields": [



        "body",



        "body.korean_field",



        "body.chinese_field",



        "body.japanese_field"



      ]



    }



  }



}



=>



{



...



  "hits": {



    "total": 2,



    "max_score": 1.6035628,



    "hits": [



      {



        "_index": "test",



        "_type": "docs",



        "_id": "3",



        "_score": 1.6035628,



        "_source": {



          "body": "第23届冬季奥运会将于2018年2月9日-25日在韩国江原道平昌展开。韩国平昌在第三次申奥之后,于2011年7月6日召开的第123届国际奥委会全会上被选定为2018年冬季奥运会的主办地。由此,韩国自1988年举办首尔夏季奥运会以后,时隔30年,将首次举办冬季奥运会。该届冬奥会的开·闭幕式以及大部分的雪上运动将在平昌进行,而所有冰上运动将在江陵、高山滑雪滑降比赛则将在旌善进行。"



        }



      },



      {



        "_index": "test",



        "_type": "docs",



        "_id": "4",



        "_score": 0.9687751,



        "_source": {



          "body": "世界の人々の祝祭、第23回冬季オリンピック大会は大韓民国江原道平昌で2018年2月9日から25日までの17日間、開催されます。大韓民国・平昌は三度の挑戦の末、2011年7月7日に開かれた第123回IOC総会で過半数票を獲得し、2018年冬季オリンピック及びパラリンピックの開催地に選ばれました。これにより1988年ソウルオリンピック開催後30年の時を経てついに、大韓民国で最初の冬季パラリンピックの舞台が繰り広げられます。平昌で開・閉会式とほぼ全ての雪上競技が開催され、江陵では氷上種目全競技が、そして旌善ではアルペンスキー滑降競技が開催される予定です。"



        }



      }



    ]



  }



}
是否有一种方式能够仅返回以与查询关键字相同语言书写的文档呢? 我们是否真的需要使用 4 款分析工具来进行文本分析呢?

语言检测工具

我们可以安装并利用可检测语言的摄取插件来节省时间和存储空间。下面的摄取管道会检测“正文”字段的语言并且会通过语言检测处理器将检测到的语言放到“语言”字段中,而非将其索引至主字段和三个子字段中。然后脚本处理器会将“正文”字段的内容复制到具体语言的字段中(english_field、korean_field、japanese_field 或 chinese_field)进行分析。

PUT _ingest/pipeline/langdetect-pipeline
{
  "description": "A pipeline to do whatever",
  "processors": [
    {
      "langdetect": {
        "field": "body",
        "target_field": "language"
      }
    },
    {
      "script": {
        "lang": "painless",
        "source": "if (ctx.language == 'ko') ctx.korean_field = ctx.body; if (ctx.language == 'ja') ctx.japanese_field = ctx.body; if (ctx.language == 'zh-cn') ctx.chinese_field = ctx.body; if (ctx.language == 'en') ctx.english_field = ctxRead More

在本篇博客文章中,我使用的是 kuromojismartcnopenkoreantext-analyzer;您也要首先安装这些插件,然后才能创建下面的索引。

DELETE test2
PUT /test2
{  
  "mappings": {
    "docs": {
      "properties": {
        "body": {
          "type": "text"
        },
        "english_field": {
          "type": "text"
        },
        "korean_field": {
          "analyzer": "openkoreantext-analyzer",
          "type": "text"
        },
        "japanese_field": {
          "analyzer": "kuromoji",
          "type": "text"
        },
        "chinese_field": {
          "analyzer": "smartcn",
          "type": "text"
        }
      }
    }
  }
}

对文档进行索引时,您应当指明使用语言检测工具的 langdetect-pipeline 管道。

PUT /test2/docs/1?pipeline=langdetect-pipeline
{
  "body" : "The XXIII Olympic Winter Games will be held for 17 days from 9 to 25 February 2018 in PyeongChang, Gangwon Province, the Republic of Korea. PyeongChang was selected as the host city of the 2018 Olympic Winter Games after receiving a majority vote at the 123rd IOC Session held on 6 July 2011 after three consecutive bids. The Olympic Winter Games will be held in Korea for the first timeRead More

示例: 如果“正文”字段的内容是韩语,则会将其复制到 korean_field,如下所示:

GET /test2/docs/2
=>
{
  "_index": "test",
  "_type": "docs",
  "_id": "2",
  "_version": 1,
  "found": true,
  "_source": {
    "language": "ko",
    "body": "제23회 동계올림픽대회는 대한민국 강원도 평창에서 2018년 2월 9일부터 25일까지 17일간 개최됩니다. 대한민국 평창은 세 번의 도전 끝에 지난 2011년 7월 6일 열린 제123차 IOC 총회에서 과반 표를 획득하며 2018년 동계올림픽 개최지로 선정되었습니다. 이로써 대한민국에서는 1988년 서울 올림픽 이후 30Read More

使用多字段的话,我们可以得到相似的搜索结果。这里用到了源文本筛选来筛选结果:

韩语

POST /test2/_search
{
  "query": {
    "multi_match": {
      "query": "올림픽대회",
      "fields": [
        "english_field",
        "korean_field",
        "chinese_field",
        "japanese_field"
      ]
    }
  },
  "_source": "body"
}
=>
...
  "hits": {
    "total": 1,
    "max_score": 0.57860667,
    "hits": [
      {
        "_index": "test",
        "_type": "docs",
        "_id": "2",
        "_score": 0.57860667,
        "_source": {
          "body": "제23회 동계올림픽대회는 대한민국 강원도 평창에서 2018년 2월 9일부터 25일까지 17Read More

英语

POST /test2/_search
{
  "query": {
    "multi_match": {
      "query": "Olympic Games",
      "fields": [
        "english_field",
        "korean_field",
        "chinese_field",
        "japanese_field"
      ]
    }
  },
  "_source": "body"
}
=>
...
  "hits": {
    "total": 1,
    "max_score": 0.97953933,
    "hits": [
      {
        "_index": "test",
        "_type": "docs",
        "_id": "1",
        "_score": 0.97953933,
        "_source": {
          "body": "The XXIII Olympic Winter Games will be held for 17 days from 9 to 25 February 2018 inRead More

日语

POST /test2/_search
{
  "query": {
    "multi_match": {
      "query": "オリンピック大会",
      "fields": [
        "english_field",
        "korean_field",
        "chinese_field",
        "japanese_field"
      ]
    }
  },
  "_source": "body"
}
=>
...
  "hits": {
    "total": 1,
    "max_score": 0.7469032,
    "hits": [
      {
        "_index": "test2",
        "_type": "docs",
        "_id": "4",
        "_score": 0.7469032,
        "_source": {
          "body": "第23回冬季オリンピック大会は大韓民国江原道平昌で2018年2月9日から25日までの17Read More

中文

POST /test2/_search
{
  "query": {
    "multi_match": {
      "query": "奥运会",
      "fields": [
        "english_field",
        "korean_field",
        "chinese_field",
        "japanese_field"
      ]
    }
  },
  "_source": "body"
}
=>
...
  "hits": {
    "total": 1,
    "max_score": 0.49148652,
    "hits": [
      {
        "_index": "test2",
        "_type": "docs",
        "_id": "3",
        "_score": 0.49148652,
        "_source": {
          "body": "第23届冬季奥运会将于2018年2月9日-25日在韩国江原道平昌展开。韩国平昌在第三次申奥之后,于2011年7月6日召开的第123Read More

请注意:由于我们搜索的只是通过具体语言分析工具分析的字段,所以当我们查询日语关键词时,我们只会得到日语文档,同理当我们查询中文关键词时,我们仅会得到中文文档。这与多字段方式有所不同,有关多字段方式,详见如何使用 Elasticsearch 6.2 搜索中文、日语和韩语文本 - 第 2 部分:多字段

担心耗时过长?

如果您担心索引或查询的时间,虽然与使用单字段相比,使用多字段或语言检测工具进行索引时耗时会稍长一点,但是其实它们之间的差别并不大。

index-time.pnguploading.4e448015.gif正在上传…重新上传取消index-time.png

图 1 - 索引 500 份文档所用的时间(MacBook Pro,2.9 GHz Intel Core i7, 16GB 2133 MHz LPDDR3)

使用多字段或语言检测工具查询所用的时间与使用单字段查询所用的时间基本相同。

query-time.pnguploading.4e448015.gif正在上传…重新上传取消query-time.pnguploading.4e448015.gif转存失败重新上传取消query-time.png

图 2 - 进行 500 次查询所用的时间 (MacBook Pro,2.9 GHz Intel Core i7, 16GB 2133 MHz LPDDR3)

通过语言检测工具,我们能够实现比多字段方法更佳的搜索结果,而且还可节省存储空间。Elasticsearch 6.x 甚至还有“稀疏字段改进措施”功能(详见 Elasticsearch 6.0 可节省空间的改善措施)。

附录

multi-lang-scripts.zip

  • index.sh - 测量索引时间的脚本
  • query.sh - 测量查询时间的脚本
这些信息有用吗?
Do you have any suggestions for improvement?

Thanks for your feedback!