14

語幹一致を検索するにはどうすればよいですか?

つまり、現時点では、フィールドに「skateboard」という単語を含むドキュメントが多数ありますが、「skateboards」というitem_title単語を含むドキュメントは 3 つだけです。このため、次の検索を行うと:

POST /my_index/my_type/_search
{
    "size": 100,
    "query" : {
        "multi_match": {
           "query": "skateboards",
           "fields": [ "item_title^3" ]
        }
    }
}

私は3つの結果しか得られません。ただし、「skateboard」という単語が含まれるドキュメントも返してほしいです。

Elasticsearch から私が理解していることから、これはitem_title、各単語の語幹バージョンにインデックスを付けるアナライザーを含むフィールドにマッピングを指定することによって行われると予想されますが、これを行う方法に関するドキュメントを見つけることができないようです。別の方法で行われることを示唆しています。

提案?

4

1 に答える 1

14

一例を次に示します。

PUT /stem
{
  "settings": {
    "analysis": {
      "filter": {
        "filter_stemmer": {
          "type": "stemmer",
          "language": "english"
        }
      },
      "analyzer": {
        "tags_analyzer": {
          "type": "custom",
          "filter": [
            "standard",
            "lowercase",
            "filter_stemmer"
          ],
          "tokenizer": "standard"
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "item_title": {
          "analyzer": "tags_analyzer",
          "type": "text"
        }
      }
    }
  }
}

いくつかのサンプル ドキュメントにインデックスを付けます。

POST /stem/test/1
{
  "item_title": "skateboards"
}
POST /stem/test/2
{
  "item_title": "skateboard"
}
POST /stem/test/3
{
  "item_title": "skate"
}

クエリを実行します。

GET /stem/test/_search
{
  "query": {
    "multi_match": {
      "query": "skateboards",
      "fields": [
        "item_title^3"
      ]
    }
  },
  "fielddata_fields": [
    "item_title"
  ]
}

そして結果を見てください:

  "hits": [
     {
        "_index": "stem",
        "_type": "test",
        "_id": "1",
        "_score": 1,
        "_source": {
           "item_title": "skateboards"
        },
        "fields": {
           "item_title": [
              "skateboard"
           ]
        }
     },
     {
        "_index": "stem",
        "_type": "test",
        "_id": "2",
        "_score": 1,
        "_source": {
           "item_title": "skateboard"
        },
        "fields": {
           "item_title": [
              "skateboard"
           ]
        }
     }
  ]

また、fielddata_fields要素を追加して、フィールドのコンテンツがどのようにインデックス付けされたかを確認できるようにしました。ご覧のとおり、どちらの場合も、索引付けされた用語はskateboardです。

于 2015-09-18T15:59:04.780 に答える