【问题标题】:Elasticsearch match with stemmingElasticsearch 与词干匹配
【发布时间】:2015-11-20 15:33:28
【问题描述】:

如何搜索词干匹配?

即目前我有很多文档在item_title 字段中包含“skateboard”这个词,但只有 3 个文档包含“skateboards”这个词。因此,当我进行以下搜索时:

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

我只得到 3 个结果。但是,我还希望退回带有“滑板”一词的文档。

根据我对 Elasticsearch 的了解,我希望这是通过在 item_title 字段上指定一个映射来完成的,该字段包含一个分析器,该分析器索引每个单词的词干版本,但我似乎找不到关于如何做到这一点,这表明它是以不同的方式完成的。

建议?

【问题讨论】:

    标签: search elasticsearch stem


    【解决方案1】:

    这是一个例子:

    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

    【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2016-10-10
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    相关资源
    最近更新 更多