首页 > 解决方案 > 如何在elasticsearch中同时搜索单词的单复数形式?

问题描述

我正在使用 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')

我希望输出文档包含扬声器,但实际输出不是包含扬声器的文档

标签: djangopython-3.xelasticsearch

解决方案


您正在寻找的搜索类型可以通过在索引时使用词干过滤器来实现。

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

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_stemmer. my_stemmer将对输入值应用english词干。

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

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

将被索引的令牌是:

jbl
speaker
build
with
perfect

通知speakers被索引为speaker和。perfectionperfect

现在,如果您搜索speakersspeaker两者都会匹配。同样,如果你搜索perfect上面的文件也会匹配。

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

更多关于词干


推荐阅读