0

「支払い参照番号」をelasticsearchに保存しています。

そのレイアウトは、たとえば次のとおりです。2-4-3-635844569819109531または2-4-2-635844533758635433など

支払い参照番号でドキュメントを検索できるようにしたい

  1. 「全体」の参照番号を使用した検索。2-4-2-635844533758635433
  2. 「開始」からの参照番号の「部分」。例2-4-2-63(..なので、例の2番目のもののみを返します)

注:「途中」や「最後」などは検索したくありません。最初からのみ。

とにかく、ハイフンは私を混乱させています。

質問

1)次のようにマッピングでそれらを削除する必要があるかどうかわかりません

"char_filter" : {
    "removeHyphen" : {
        "type" : "mapping",
            "mappings" : ["-=>"]
        }
    },

か否か。そのような方法でマッピングを使用したことがないため、これが必要かどうかはわかりません。

2)参照番号の一部を存在から検索できるようにしたいので、「ngrams」フィルターが必要だと思います。のようなものだと思います

"partial_word":{
    "filter":[
        "standard",
            "lowercase",
            "name_ngrams"
        ],
    "type":"custom",
    "tokenizer":"whitespace"
},

そしてフィルター

"name_ngrams":{
    "side":"front",
        "max_gram":50,
        "min_gram":2,
    "type":"edgeNGram"
},

全体をどうまとめたらいいのかわかりませんが、

"paymentReference":{
    "type":"string",
    "analyzer": "??",
    "fields":{
        "partial":{
            "search_analyzer":"???",
            "index_analyzer":"partial_word",
            "type":"string"
        }
    }
}

私が試したことはすべて、2番目の検索ケースで常に「壊れる」ようです。

私が行う'localhost:9200/orders/_analyze?field=paymentReference&pretty=1' -d "2-4-2-635844533758635433"と、それは常にハイフンを独自のトークンとして分割し、たとえば2-「たくさん」のすべてのドキュメントを返します! 探しているときに欲しいものではありません2-4-2-6

私が達成しようとしている 2 種類の検索にこのフィールドをマップする方法を教えてもらえますか?

更新 - 回答

事実上、ヴァルが以下に言ったこと。アナライザーをより具体的にするためにマッピングを少し変更しました。また、部分的なクエリを実行するだけなので、メインの文字列にインデックスを付ける必要はありません。

マッピング

"paymentReference":{
    "type": "string",
    "index":"not_analyzed",
    "fields": {
        "partial": {
            "search_analyzer":"payment_ref",
            "index_analyzer":"payment_ref",
            "type":"string"
        }
    }
}

アナライザ

"payment_ref": {
    "type": "custom",
    "filter": [
        "lowercase",
        "name_ngrams"
    ],
    "tokenizer": "keyword"
}

フィルター

"name_ngrams":{
    "side":"front",
    "max_gram":50,
    "min_gram":2,
    "type":"edgeNGram"
},
4

2 に答える 2

0

これには、マッピング文字フィルターを使用する必要はありません。

プレフィックスのみを検索できるようにする必要があるため、Edge NGram トークン フィルターを使用して正しい方向に進んでいます。代わりにトークナイザーを使用しkeywordて、用語が全体として解釈されるようにします。したがって、これを設定する方法は次のようになります。

curl -XPUT localhost:9200/orders -d '{
  "settings": {
    "analysis": {
      "analyzer": {
        "partial_word": {
          "type": "custom",
          "filter": [
            "lowercase",
            "ngram_filter"
          ],
          "tokenizer": "keyword"
        }
      },
      "filter": {
        "ngram_filter": {
          "type": "edgeNGram",
          "min_gram": 2,
          "max_gram": 50
        }
      }
    }
  },
  "mappings": {
    "order": {
      "properties": {
        "paymentReference": {
          "type": "string",
          "fields": {
            "partial": {
              "analyzer": "partial_word",
              "type": "string"
            }
          }
        }
      }
    }
  }
}'

paymentReference.partial次に、フィールドにインデックスが作成される内容を分析できます。

curl -XGET 'localhost:9205/payments/_analyze?field=paymentReference.partial&pretty=1' -d "2-4-2-635844533758635433"

そして、まさにあなたが望むもの、つまりすべてのプレフィックスを取得します:

{
  "tokens" : [ {
    "token" : "2-",
    "start_offset" : 0,
    "end_offset" : 24,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "2-4",
    "start_offset" : 0,
    "end_offset" : 24,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "2-4-",
    "start_offset" : 0,
    "end_offset" : 24,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "2-4-2",
    "start_offset" : 0,
    "end_offset" : 24,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "2-4-2-",
    "start_offset" : 0,
    "end_offset" : 24,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "2-4-2-6",
    "start_offset" : 0,
    "end_offset" : 24,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "2-4-2-63",
    "start_offset" : 0,
    "end_offset" : 24,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "2-4-2-635",
    "start_offset" : 0,
    "end_offset" : 24,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "2-4-2-6358",
    "start_offset" : 0,
    "end_offset" : 24,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "2-4-2-63584",
    "start_offset" : 0,
    "end_offset" : 24,
    "type" : "word",
    "position" : 1
  }, {
  ...

最後に、プレフィックスを検索できます。

curl -XGET localhost:9200/orders/order/_search?q=paymentReference.partial:2-4-3
于 2015-12-02T06:40:51.000 に答える