5

Google のようなオートコンプリートに似ていますが、1 つのトークンまたは単語のみを使用して、トークンに基づいて用語を完成させる方法に関する提案を作成したいと考えています。

トークン化されるファイル名を検索したいと思います。たとえば、「BRAND_Connect_A1233.jpg」は、「brand」、「connect」、「a1234」、および「jpg」にトークン化されます。

ここで、たとえば「 Con 」について何か提案をお願いしたいと思います。提案は、完全なファイル名ではなく、完全に一致するトークンを提供する必要があります。

  • 接続
  • 輪郭
  • 概念
  • ...

「A12」の候補は、「A1234」、「A1233」、「A1233」のはずです...

クエリ、ファセット、およびフィルターの操作は正常に機能します。

まず、トークナイザーとフィルターを含むマッピングを作成しました。

curl -XPUT 'localhost:9200/files/?pretty=1'  -d '
{
   "settings" : {
      "analysis" : {
         "analyzer" : {
            "filename_search" : {
               "tokenizer" : "filename",
               "filter" : ["lowercase"]
            },
            "filename_index" : {
               "tokenizer" : "filename",
               "filter" : ["lowercase","edge_ngram"]
            }
         },
         "tokenizer" : {
            "filename" : {
               "pattern" : "[^[;_\\.\\/]\\d]+",
               "type" : "pattern"
            }
         },
         "filter" : {
            "edge_ngram" : {
               "side" : "front",
               "max_gram" : 20,
               "min_gram" : 2,
               "type" : "edgeNGram"
            }
         }
      }
   },
   "mappings" : {
      "file" : {
         "properties" : {
            "filename" : {
               "type" : "string",
               "search_analyzer" : "filename_search",
               "index_analyzer" : "filename_index"
            }
         }
      }
   }
}'

どちらのアナライザーも非常にうまく機能します。

curl -XGET 'localhost:9200/files/_analyze?pretty=1&text=BRAND_ConnectBlue_A1234.jpg&analyzer=filename_search'
curl -XGET 'localhost:9200/files/_analyze?pretty=1&text=BRAND_ConnectBlue_A1234.jpg&analyzer=filename_index'

今、いくつかのサンプルデータを追加しました

curl -X POST "localhost:9200/files/file" -d '{ "filename" : "BRAND_ConnectBlue_A1234.jpg"}'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "BRAND_Connect_A1233.jpg"}'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "BRAND_ConceptSpace_A1244.jpg"}'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "COMPANY_Connect_A1222.jpg"}'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "COMPANY_Concept_A1233.jpg"}'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "DEALER_Connect_B1234_.jpg"}'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "DEALER_Contour21_B1233.jpg"}'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "DEALER_ConceptCube_B2233.jpg"}'
curl -X POST "localhost:9200/files/_refresh"

望ましい提案を得るためのさまざまなアプローチは、期待される結果をもたらしません。アナライザーに名前を付けようとし、アナライザーとワイルドカードのさまざまな組み合わせを試しました。

curl -XGET 'localhost:9200/files/_suggest?pretty=true'  -d '{
    "text" : "con",
    "simple_phrase" : {
      "phrase" : {
        "field" : "filename",
        "size" : 15,
        "real_word_error_likelihood" : 0.75,
        "max_errors" : 0.1,
        "gram_size" : 3
      }
    }
}'
curl -XGET 'localhost:9200/files/_suggest?pretty=true'  -d '{
    "my-suggestion" : {
    "text" : "con",
    "term" : {
        "field" : "filename",
        "analyzer": "filename_index"
        }
    }
}'
4

1 に答える 1

0

公式の ElasticSearch docs に記載されているように、補完サジェスターを使用するには特別なマッピングを追加する必要があります。あなたの例を修正して、それがどのように機能するかを示しました。

まずインデックスを作成します。filename_suggestマッピングに注意してください。

curl -XPUT 'localhost:9200/files/?pretty=1'  -d '
{
   "settings" : {
      "analysis" : {
         "analyzer" : {
            "filename_search" : {
               "tokenizer" : "filename",
               "filter" : ["lowercase"]
            },
            "filename_index" : {
               "tokenizer" : "filename",
               "filter" : ["lowercase","edge_ngram"]
            }
         },
         "tokenizer" : {
            "filename" : {
               "pattern" : "[^[;_\\.\\/]\\d]+",
               "type" : "pattern"
            }
         },
         "filter" : {
            "edge_ngram" : {
               "side" : "front",
               "max_gram" : 20,
               "min_gram" : 2,
               "type" : "edgeNGram"
            }
         }
      }
   },
   "mappings" : {
      "file" : {
         "properties" : {
            "filename" : {
               "type" : "string",
               "analyzer": "filename_index",
               "search_analyzer" : "filename_search"
            },
            "filename_suggest": {
              "type": "completion",
              "analyzer": "simple",
              "search_analyzer": "simple",
              "payloads": true
            }
         }
      }
   }
}'

いくつかのデータを追加します。に一致するキーワードを含むフィールドがあることに注意してくださいfilename_suggestinput

curl -X POST "localhost:9200/files/file" -d '{ "filename" : "BRAND_ConnectBlue_A1234.jpg", "filename_suggest": { "input": ["BRAND", "ConnectBlue", "A1234", "jpg"], "payload": {} } }'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "BRAND_Connect_A1233.jpg", "filename_suggest": { "input": ["BRAND", "Connect", "A1233", "jpg"], "payload": {} } }'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "BRAND_ConceptSpace_A1244.jpg", "filename_suggest": { "input": ["BRAND", "ConceptSpace", "A1244", "jpg"], "payload": {} } }'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "COMPANY_Connect_A1222.jpg", "filename_suggest": { "input": ["COMPANY", "Connect", "A1222", "jpg"], "payload": {} } }'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "COMPANY_Concept_A1233.jpg", "filename_suggest": { "input": ["COMPANY", "Concept", "A1233", "jpg"], "payload": {} } }'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "DEALER_Connect_B1234_.jpg", "filename_suggest": { "input": ["DEALER", "Connect", "B1234", "jpg"], "payload": {} } }'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "DEALER_Contour21_B1233.jpg", "filename_suggest": { "input": ["DEALER", "Contour21", "B1233", "jpg"], "payload": {} }}'
curl -X POST "localhost:9200/files/file" -d '{ "filename" : "DEALER_ConceptCube_B2233.jpg", "filename_suggest": { "input": ["DEALER", "ConceptCube", "B2233", "jpg"], "payload": {} }}'
curl -X POST "localhost:9200/files/_refresh"

次にクエリを実行します。

curl -XPOST 'localhost:9200/files/_suggest?pretty=true'  -d '{
    "filename_suggest" : {
        "text" : "con",
        "completion": {
            "field": "filename_suggest", "size": 10
        }
    }
}'

結果:

{
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "filename_suggest" : [ {
    "text" : "con",
    "offset" : 0,
    "length" : 3,
    "options" : [ {
      "text" : "Connect",
      "score" : 2.0,
      "payload":{}
    }, {
      "text" : "Concept",
      "score" : 1.0,
      "payload":{}
    }, {
      "text" : "ConceptSpace",
      "score" : 1.0,
      "payload":{}
    }, {
      "text" : "ConnectBlue",
      "score" : 1.0,
      "payload":{}
    }, {
      "text" : "Contour21",
      "score" : 1.0,
      "payload":{}
    } ]
  } ]
}
于 2016-09-16T17:56:22.863 に答える