如何在Elasticsearch中同时搜索单数形式和复数形式的单词?

时间:2019-04-08 04:37:34

标签: django python-3.x elasticsearch

我正在使用Q对象进行弹性查询,并且已经建立了索引文档,其中一个文档包含“ jbl说话者很棒”,但是我的查询中却包含“ speaker”而不是说话者,我该如何使用查询字符串查找此文档。 / p>

我尝试过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')

我希望输出文档包含发言人,但 实际输出是没有包含发言人的文件

1 个答案:

答案 0 :(得分:0)

正在寻找索引的搜索类型可以通过在索引编制时使用stemmer token filter来实现。

使用下面的示例映射来了解其工作原理:

Settings > Editor > Color Scheme > Kotlin

对于上面映射中的字段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_analyzerlowercasemy_stemmer将基于输入值应用my_stemmer

例如如果我们将文档编入索引如下:

english

将被索引的令牌为:

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

通知jbl speaker build with perfect 索引为speakersspeaker索引为perfection

现在,如果您搜索perfectspeakers都将匹配。同样,如果您搜索speaker,则上述文档将匹配。

为什么perfectspeakers会匹配,这可能是您想到的一个问题。原因是默认情况下,弹性搜索会应用与在搜索时建立索引时所使用的分析器相同的分析器。因此,如果您搜索perfection,它将实际上是在搜索perfection,从而找到匹配项。

有关stemming的更多信息。