2018年6月18日 工程

如何使用 Elasticsearch 6.2 搜索中文、日文和韩文文本 - 第 2 部分: 多字段

作者 Kiju Kim

如何使用 Elasticsearch 6.2 搜索中文、日文和韩文文本 - 第 1 部分: 分析工具 谈到了搜索以多种语言编写的文档的相关问题以及有关语言分析工具的问题。 现在我们看一下使用单字段对多语言文档进行索引时的相关问题,以及如何使用多字段解决这一问题。 文本节选自 https://www.pyeongchang2018.com/en/about-the-games


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

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


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 款分析工具来进行文本分析呢? 最后,[如何使用 Elasticsearch 6.2 搜索中文、日文和韩文文本 - 第 3 部分: 语言检测工具]会介绍语言检测工具以及我们可以如何进行改进。