[ElasticSearch]ハングル検索を自動的に完了


リファレンスリンク


Elasticsearch自動完了の実装
SuggestAPIの概要
Korean Jaso Analyzer

SuggestAPI


suggestAPIは、ユーザが入力したキーワードが正しくない場合や検索結果がない場合に、ドキュメントに存在する単語に対して類似のキーワードを変更できる校正機能を提供する.
  • Term Suggest API:推奨
    エラー照合法
  • は、インデックスの特定のフィールドでエラースペルに最も類似した単語を推奨する
  • Completion Suggest API:自動完了推奨
    ユーザーが入力を完了する前に、自動完了予測を使用して検索結果を表示し、
  • でユーザーの検索を支援します.
  • Phrase Suggest API:推奨文書
  • Context Suggest API:推奨コンテキスト推奨
  • データの準備

    curl -XPUT 'http://localhost:9200/auto_complete?include_type_name=true&pretty' -H 'Content-Type: application/json' -d '{
      "mappings": {
        "_doc": {
          "properties": {
            "search_string": {
              "type": "completion"
            }
          }
        }
      }
    }'
    マッピングにより、自動的に完了することを推奨するフィールドを「type」:「completion」と指定します.

    「完了」を使用して自動的に完了


    先頭の文字が一致するデータを返します.
    ただし、中間マッチングの検索語は含まれません.
    curl -XGET 'localhost:9200/auto_complete/_search?pretty' -H 'Content-Type: application/json' -d'{
      "suggest": {
        "search-string-suggest": {
          "prefix": "빨",
          "completion": {
            "field": "search_string"
          }
        }
      }
    }'
    「prefix」で、一番前に一致する文字を指定します.

    nGram Tokenizer

  • タイプ:nGram
  • オプション
  • min_gram:トークンの最小長、デフォルト=1
  • max_gram:トークンの最大長、デフォルト=2
  • token_chars:指定された値に基づいて、対応するフォーマットがタグとみなされます.
    [アルファベット:a b等アルファベット文字
    数字:0 1 2位
    スペース:スペースと接尾辞
    punctuation : !靴屋
    シンボル:特殊文字]
  • 最大最小トークン長がmin_gramおよびmax_gramで決定されると、その範囲内のすべてのトークンが生成される.
    たとえば、最大長を3、最小長を1と指定したら、helloworldと入力します.
    h,e,l,o,w,r,l,d,he,hel, ... このようにして値をインデックスします.
    nGramを使用すると、重要なフィールドを2~3文字で検索できますが、検索語の数が増えるにつれてメモリ使用量やシステム負荷も増加します.

    データの準備

    curl -XPUT 'http://localhost:9200/auto_complete?include_type_name=true&pretty' -H 'Content-Type: application/json' -d '{
      "settings" : {
        "index":{
          "max_ngram_diff": 50,
          "analysis":{
            "analyzer":{
              "my_ngram_analyzer": { //분석기 customize 
                "tokenizer": "my_ngram_tokenizer"
              }
            },
            "tokenizer": { //ngram 토크나이저 customize
              "my_ngram_tokenizer": {
                "type": "ngram",
                "min_gram": "1",
                "max_gram": "10"
              }
            }
          }
        }
      },
      "mappings": {
        "_doc": {
          "properties": {
            "search_string": {
              "type": "text",
              "fields": { //다중필드
                "ngram": { //ngram 옵션이면
                  "type": "text",
                  "analyzer": "my_ngram_analyzer" //커스텀한 ngram 토크나이저 분석기로 분석해서 검색하기 
                }
              }
            }
          }
        }
      }
    }'

    検索


    今は必ずしも先頭の文字でなくても、内容の「歯」のデータは検索できます!Tokenizerで一つの字を割ってしまったからです.
    curl -XGET http://localhost:9200/auto_complete/_search?pretty -H 'Content-Type: application/json' -d '{
      "query": {
        "match": {
          "search_string.ngram": "빨"
        }
      }
    }'

    Korean Jaso Analyzer


    https://github.com/netcrazy/elasticsearch-jaso-analyzer
    ハングル文字単位で自動的に完了します.
    検索可能ワード単位(ex.->洗濯室)
  • 英文字エラー(ex.Qkf->歯)
  • を修正

    ElasticSearch 7.16.2版を入手

    cd C:\Users\OCS\Desktop\개발\elasticsearch-7.17.2-windows-x86_64\elasticsearch-7.17.2\bin
    
    C:\Users\OCS\Desktop\개발\elasticsearch-7.17.2-windows-x86_64\elasticsearch-7.17.2\bin>sudo elasticsearch-plugin install https://github.com/netcrazy/elasticsearch-jaso-analyzer/releases/download/v7.16.2/jaso-analyzer-plugin-7.16.2-plugin.zip
    "warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME"
    -> Installing https://github.com/netcrazy/elasticsearch-jaso-analyzer/releases/download/v7.16.2/jaso-analyzer-plugin-7.16.2-plugin.zip
    -> Downloading https://github.com/netcrazy/elasticsearch-jaso-analyzer/releases/download/v7.16.2/jaso-analyzer-plugin-7.16.2-plugin.zip
    [=================================================] 100%??
    -> Failed installing https://github.com/netcrazy/elasticsearch-jaso-analyzer/releases/download/v7.16.2/jaso-analyzer-plugin-7.16.2-plugin.zip
    -> Rolling back https://github.com/netcrazy/elasticsearch-jaso-analyzer/releases/download/v7.16.2/jaso-analyzer-plugin-7.16.2-plugin.zip
    -> Rolled back https://github.com/netcrazy/elasticsearch-jaso-analyzer/releases/download/v7.16.2/jaso-analyzer-plugin-7.16.2-plugin.zip
    Exception in thread "main" java.lang.IllegalArgumentException: Plugin [jaso-analyzer] was built for Elasticsearch version 7.16.2 but version 7.17.2 is running
            at org.elasticsearch.plugins.PluginsService.verifyCompatibility(PluginsService.java:391)
            at org.elasticsearch.plugins.cli.InstallPluginAction.loadPluginInfo(InstallPluginAction.java:831)
            at org.elasticsearch.plugins.cli.InstallPluginAction.installPlugin(InstallPluginAction.java:887)
            at org.elasticsearch.plugins.cli.InstallPluginAction.execute(InstallPluginAction.java:245)
            at org.elasticsearch.plugins.cli.InstallPluginCommand.execute(InstallPluginCommand.java:88)
            at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77)
            at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112)
            at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:95)
            at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112)
            at org.elasticsearch.cli.Command.main(Command.java:77)
            at org.elasticsearch.plugins.cli.PluginCli.main(PluginCli.java:36)
    無視しようとしたが、次のエラーが発生しました.😅
    もう一度Elastic Searchバージョンを受け入れ、、(ローカルにElastic Search zipファイルがどれだけ代替されているか)

    設定

    bin/elasticsearch-plugin install https://github.com/netcrazy/elasticsearch-jaso-analyzer/releases/download/v7.16.2/jaso-analyzer-plugin-7.16.2-plugin.zip

    設定と索引の作成

    curl -XPUT -H 'Content-Type: application/json' http://localhost:9200/jaso/ -d '{
      "settings": {
        "index": {
          "analysis": {
            "filter": {
              "suggest_filter": {
                "type": "edge_ngram",
                "min_gram": 1,
                "max_gram": 50
              }
            },
            "tokenizer": {
              "jaso_search_tokenizer": {
                "type": "jaso_tokenizer",
                "mistype": true,
                "chosung": false
              },
              "jaso_index_tokenizer": {
                "type": "jaso_tokenizer",
                "mistype": true,
                "chosung": true
              }
            },
            "analyzer": {
              "suggest_search_analyzer": {
                "type": "custom",
                "tokenizer": "jaso_search_tokenizer"
              },
              "suggest_index_analyzer": {
                "type": "custom",
                "tokenizer": "jaso_index_tokenizer",
                "filter": [
                  "suggest_filter"
                ]
              }
            }
          }
        }
      }
    }'

    インデックスマッピング

    curl -XPUT -H 'Content-Type: application/json' http://localhost:9200/jaso/_mapping/test -d '{
      "properties": {
        "name": {
          "type": "text",
          "store": true,
          "analyzer": "suggest_index_analyzer",
          "search_analyzer": "suggest_search_analyzer"
        }
      }
    }'
  • このプロセスで次のエラーが発生しました:
  •   "type": "illegal_argument_exception",
            "reason": "Types cannot be provided in get mapping requests, unless include_type_name is set to true."
    マッピングでフィールドタイプを設定する場合、include_type_nameパラメータ(パラメータ)をtrueと呼びます.

    あなたの言うとおりにして、よく写りました!

    ドキュメントの生成

    curl -XPOST -H 'Content-Type: application/json' http://localhost:9200/jaso/test?pretty=true -d '{
        "name":"최일규 Hello"
    }'
    
    curl -XPOST -H 'Content-Type: application/json' http://localhost:9200/jaso/test?pretty=true -d '{
        "name":"초아"
    }'

    ドキュメントの検索

    curl -XPOST -H 'Content-Type: application/json' http://localhost:9200/jaso/test/_search?pretty=true -d '{
        "query" : {
            "match" : { "name" : "초" }
        }
    }'
    
    curl -XPOST -H 'Content-Type: application/json' http://localhost:9200/jaso/test/_search?pretty=true -d '{
        "query" : {
            "match" : { "name" : "ㅊㅇㄱ" }
        }
    }'