3

フルネームマッチングとパーシャルネームマッチングを使用してelasticsearchインスタンスのマッピングを設定しようとしています:

curl -XPUT 'http://127.0.0.1:9200/test/?pretty=1'  -d '{
  "mappings": {
    "venue": {
      "properties": {
        "location": {
          "type": "geo_point"
        },
        "name": {
          "fields": {
            "name": {
              "type": "string",
              "analyzer": "full_name"
            },
            "partial": {
              "search_analyzer": "full_name",
              "index_analyzer": "partial_name",
              "type": "string"
            }
          },
          "type": "multi_field"
        }
      }
    }
  },
  "settings": {
    "analysis": {
      "filter": {
        "swedish_snow": {
          "type": "snowball",
          "language": "Swedish"
        },
        "name_synonyms": {
          "type": "synonym",
          "synonyms_path": "name_synonyms.txt"
        },
        "name_ngrams": {
          "side": "front",
          "min_gram": 2,
          "max_gram": 50,
          "type": "edgeNGram"
        }
      },
      "analyzer": {
        "full_name": {
          "filter": [
            "standard",
            "lowercase"
          ],
          "type": "custom",
          "tokenizer": "standard"
        },
        "partial_name": {
          "filter": [
            "swedish_snow",
            "lowercase",
            "name_synonyms",
            "name_ngrams",
            "standard"
          ],
          "type": "custom",
          "tokenizer": "standard"
        }
      }
    }
  }
}'

私はそれにいくつかのデータを記入します:

curl -XPOST 'http://127.0.0.1:9200/_bulk?pretty=1'  -d '
{"index" : {"_index" : "test", "_type" : "venue"}}
{"location" : [59.3366, 18.0315], "name" : "johnssons"}
{"index" : {"_index" : "test", "_type" : "venue"}}
{"location" : [59.3366, 18.0315], "name" : "johnsson"}
{"index" : {"_index" : "test", "_type" : "venue"}}
{"location" : [59.3366, 18.0315], "name" : "jöhnsson"}
'

テストするためにいくつかの検索を実行します、 フルネーム:

curl -XGET 'http://127.0.0.1:9200/test/venue/_search?pretty=1' -d '{
  "query": {
    "bool": {
      "should": [
        {
          "text": {
            "name": {
              "boost": 1,
              "query": "johnsson"
            }
          }
        },
        {
          "text": {
            "name.partial": "johnsson"
          }
        }
      ]
    }
  }
}'

結果:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.29834434,
    "hits": [
      {
        "_index": "test",
        "_type": "venue",
        "_id": "CAO-dDr2TFOuCM4pFfNDSw",
        "_score": 0.29834434,
        "_source": {
          "location": [
            59.3366,
            18.0315
          ],
          "name": "johnsson"
        }
      },
      {
        "_index": "test",
        "_type": "venue",
        "_id": "UQWGn8L9Squ5RYDMd4jqKA",
        "_score": 0.14663845,
        "_source": {
          "location": [
            59.3366,
            18.0315
          ],
          "name": "johnssons"
        }
      }
    ]
  }
}

部分名:

curl -XGET 'http://127.0.0.1:9200/test/venue/_search?pretty=1' -d '{
  "query": {
    "bool": {
      "should": [
        {
          "text": {
            "name": {
              "boost": 1,
              "query": "johns"
            }
          }
        },
        {
          "text": {
            "name.partial": "johns"
          }
        }
      ]
    }
  }
}'

結果:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.14663845,
    "hits": [
      {
        "_index": "test",
        "_type": "venue",
        "_id": "UQWGn8L9Squ5RYDMd4jqKA",
        "_score": 0.14663845,
        "_source": {
          "location": [
            59.3366,
            18.0315
          ],
          "name": "johnssons"
        }
      },
      {
        "_index": "test",
        "_type": "venue",
        "_id": "CAO-dDr2TFOuCM4pFfNDSw",
        "_score": 0.016878016,
        "_source": {
          "location": [
            59.3366,
            18.0315
          ],
          "name": "johnsson"
        }
      }
    ]
  }
}

名前内の名前:

curl -XGET 'http://127.0.0.1:9200/test/venue/_search?pretty=1' -d '{
  "query": {
    "bool": {
      "should": [
        {
          "text": {
            "ame": {
              "boost": 1,
              "query": "johnssons"
            }
          }
        },
        {
          "text": {
            "name.partial": "johnssons"
          }
        }
      ]
    }
  }
}'

結果:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.39103588,
    "hits": [
      {
        "_index": "test",
        "_type": "venue",
        "_id": "UQWGn8L9Squ5RYDMd4jqKA",
        "_score": 0.39103588,
        "_source": {
          "location": [
            59.3366,
            18.0315
          ],
          "name": "johnssons"
        }
      }
    ]
  }
}

ご覧のとおり、私は1つの会場しか取り戻していませんjohnssons。私は両方johnssonsjohnsson取り戻すべきではありませんか?設定で何が間違っていますか?

4

1 に答える 1

2

full_nameフィールドの検索アナライザーとしてanalyzedを使用していname.partialます。その結果、クエリは用語のクエリに変換されますがjohnssons、これは何にも一致しません。

Analyze APIを使用して、レコードのインデックス作成方法を確認できます。たとえば、このコマンド

curl -XGET 'http://127.0.0.1:9200/test/_analyze?analyzer=partial_name&pretty=1' -d 'johnssons'

インデックス作成中に、文字列「johnssons」が次の用語に翻訳されていることがわかります:「jo」、「joh」、「john」、「johns」、「johnss」、「johnsso」、「johnsson」。このコマンドが

 curl -XGET 'http://127.0.0.1:9200/test/_analyze?analyzer=full_name&pretty=1' -d 'johnssons'

検索中に文字列「johnssons」が用語「johnssons」に翻訳されていることが表示されます。ご覧のとおり、ここでは検索用語とデータの間に一致はありません。

于 2012-12-07T12:01:47.690 に答える