【问题标题】:How to search both singular and plural form of word in elasticsearch?如何在elasticsearch中同时搜索单数和复数形式的单词?
【发布时间】:2019-04-08 04:37:33
【问题描述】:

我正在使用 Q 对象进行弹性查询,并且我已经索引了文档,其中一个文档包含“jbl 演讲者很棒”,但我的查询有“演讲者”而不是演讲者我如何才能找到这个带有查询字符串的文档。

我尝试了 match_phrase,但它无法找到该文档,当我尝试 query_string 时,它抛出了一个错误,提示“query_string 不支持某些键”。我也尝试过通配符,但这也不适用于像

这样的查询
{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase": {
            "prod_group": "06"
          }
        },
        {
          "match_phrase": {
            "prod_group": "apparel"
          }
        },
        {
          "wildcard": {
            "prod_cat_for_search": "+speaker*"
          }
        },
        {
          "range": {
            "date": {
              "gte": "2018-04-07"
            }
          }
        }
      ]
    }
  }
}
Q('match_phrase', prod_cat_for_search='speaker')

我希望输出文档包含扬声器,但是 实际输出是没有包含发言者的文档

【问题讨论】:

    标签: django python-3.x elasticsearch


    【解决方案1】:

    您要查找的搜索类型可以通过在索引时使用stemmer token filter 来实现。

    让我们看看它是如何使用下面的示例映射工作的:

    PUT test
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_analyzer": {
              "type": "custom",
              "filter": [
                "lowercase",
                "my_stemmer"
              ],
              "tokenizer": "whitespace"
            }
          },
          "filter": {
            "my_stemmer": {
              "type": "stemmer",
              "name": "english"
            }
          }
        }
      },
      "mappings": {
        "doc": {
          "properties": {
            "description": {
              "type": "text",
              "analyzer": "my_analyzer",
              "fields": {
                "keyword": {
                  "type": "keyword"
                }
              }
            }
          }
        }
      }
    }
    

    对于上面映射中的字段description,我们使用分析器作为my_analyzer。此分析器将应用令牌过滤器 lowercasemy_stemmermy_stemmer 将在输入值上应用 english 词干。

    例如如果我们索引一个文档如下:

    {
       "description": "JBL speakers build with perfection"
    }
    

    将被索引的标记是:

    jbl
    speaker
    build
    with
    perfect
    

    注意speakers 被索引为speakerperfectionperfect

    现在,如果您搜索 speakersspeaker,两者都会匹配。同样,如果您搜索perfect,上述文档将匹配。

    为什么speakersperfection 会匹配可能是您脑海中浮现的一个问题。这样做的原因是,默认情况下,弹性搜索应用与搜索时索引时使用的分析器相同的分析器。因此,如果您搜索 perfection,它实际上是在搜索 perfect 并因此匹配。

    更多关于stemming

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      相关资源
      最近更新 更多