当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch停止令牌过滤器不工作

沈枫涟
2023-03-14

我在Elasticsearch 7.10中创建了一个索引,如下所示:

{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "title": {
        "type": "text"
      },
      "description": {
        "type": "text"
      }
    }
  },
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "filter": [
            "lowercase",
            "stemmer",
            "stop"
          ],
          "type": "custom",
          "tokenizer": "standard"
        }
      }
    }
  }
}

如您所见,我配置了一个名为my_analyzer的自定义分析器,该分析器应用了令牌过滤器。基于文档,我希望这个过滤器在索引时从文档的所有类型属性中删除英语stopwords。

事实上,如果我向http://localhost:30200/my_index/_analyze使用此请求主体:

{
  "analyzer": "my_analyzer",
  "text": "If you are a horse, I do not want that cake"
}

我得到一个响应,表明令牌ifanot和已从提供的文本中删除:

{
    "tokens": [
        {
            "token": "you",
            "start_offset": 3,
            "end_offset": 6,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "ar",
            "start_offset": 7,
            "end_offset": 10,
            "type": "<ALPHANUM>",
            "position": 2
        },
        {
            "token": "hors",
            "start_offset": 13,
            "end_offset": 18,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "i",
            "start_offset": 20,
            "end_offset": 21,
            "type": "<ALPHANUM>",
            "position": 5
        },
        {
            "token": "do",
            "start_offset": 22,
            "end_offset": 24,
            "type": "<ALPHANUM>",
            "position": 6
        },
        {
            "token": "want",
            "start_offset": 29,
            "end_offset": 33,
            "type": "<ALPHANUM>",
            "position": 8
        },
        {
            "token": "cake",
            "start_offset": 39,
            "end_offset": 43,
            "type": "<ALPHANUM>",
            "position": 10
        }
    ]
}

但是,如果我索引一个文档,其属性包含字符串“if you are horse,I don’t want that cake”,然后通过请求http://localhost:30200/my_index/_search使用此请求主体:

{
  "query": {
    "multi_match" : {
      "query": "that", 
      "fields": ["description"]
    }
  }
}

返回文档,即使本应被分析仪删除的单词“that”:

{
    "took": 3,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.2876821,
        "hits": [
            {
                "_index": "my_index",
                "_type": "_doc",
                "_id": "27ibobulhqhc7s96jbz6653ud",
                "_score": 0.2876821,
                "_source": {
                    "id": "27ibobulhqhc7s96jbz6653ud",
                    "title": "muscular yak",
                    "description": "If you are a horse, I do not want that cake"
                }
            }
        ]
    }
}

那么是什么?如果停止过滤器从索引的文本属性中剥离英语停止词,我希望查询其中一个停止词会返回零结果。在索引文档或处理查询时,我是否必须明确告诉Elasticsearch使用my_analyzer?

值得一提的是,我配置的其他过滤器(小写和词干分析器)似乎按预期工作。这只会给我带来麻烦。

共有1个答案

公良俊楚
2023-03-14

您就快到了。您只需要将您的描述字段与您创建的客户分析器进行映射,如下所示。这将确保描述字段的内容在索引和搜索时使用my_analyzer

{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "title": {
        "type": "text"
      },
      "description": {
        "type": "text",
        "analyzer": "my_analyzer"          // note this
      }
    }
  },
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "filter": [
            "lowercase",
            "stemmer",
            "stop"
          ],
          "type": "custom",
          "tokenizer": "standard"
        }
      }
    }
  }
}
 类似资料:
  • 问题内容: 由于我是elasticsearch的新手,因此我无法识别 ngram令牌过滤器 和 edge ngram令牌过滤器 之间的 区别 。 两者在处理令牌方面有何不同? 问题答案: 我认为文档对此非常清楚: 该标记器与nGram非常相似,但仅保留从标记开头开始的n-gram。 标记器的最佳示例再次来自文档: 使用此标记生成器定义: 简而言之: 令牌生成器将根据令牌的配置来创建令牌。在这个例子

  • 问题内容: 我正在尝试使用Elasticsearch来实现自动完成功能,因为我知道该怎么做… 我正在尝试在索引已爬网数据时使用ES的edge_n_grams建立多词(短语)建议。 a 和a 之间有什么区别-我已经阅读了有关这些文档,但仍需要更多了解…。 例如,token_filter是ES用来针对用户输入进行搜索的内容吗?ES用于制作令牌的令牌生成器是吗?什么是代币? ES是否可以使用其中任何一种

  • 主要内容:Apache Ant令牌过滤器示例令牌过滤器允许我们在复制时过滤文件中的数据。 要进行过滤,需要使用一个必须与过滤器任务中的设置匹配的标记。 任务使用作为标记分隔符。 为了实现此功能,Apache Ant提供了使用属性的。 此功能仅应与文本文件一起使用。下面来看看Apache Ant令牌过滤器属性: 属性 描述 必要 它是没有分隔符字符(@)的标记字符串。 Y 这是一个字符串,应该在复制文件时替换令牌。 Y 必须从中读取过滤器的文

  • 问题内容: 文档中没有示例,我只是想知道从输入中得到什么。 问题答案: 在Elasticsearch 0.16(Lucene 3.1)之前,标准令牌过滤器是“标准化由标准令牌生成器提取的令牌”。具体来说,它是删除首字母缩写词和句点的末尾。因此,通过标准过滤器后, 将成为 过去。从Elasticsearch 0.16(Lucene 3.1)开始,标准令牌过滤器不执行任何操作(至少在当前情况下)。它只

  • 问题内容: 我一直在与ElasticSearch一起玩我的一个新项目。我已将默认分析器设置为使用ngram tokenfilter。这是我的elasticsearch.yml文件: 我创建了一个新索引并向其中添加了以下文档: 但是,当我使用查询或任何其他部分术语进行搜索时,ElasticSearch不会返回此文档。仅当我搜索确切的字词(如)时,它才会返回文档。 我还尝试过更改配置文件,以便defa

  • 问题内容: 我在elasticsearch中拥有大型文档存储,并希望检索不同的过滤器值以显示在HTML下拉列表中。 一个例子是像 下拉列表应包含部门列表,即IT,客户和管理部门。 请问有什么好心的人向我指出正确的方向,以便从Elasticsearch检索不同的部门列表吗? 谢谢 问题答案: 这是聚合(文档)的工作。 您可以使用以下不同的值: 在您的示例中,输出: 另外两个注意事项: 设置为0会将最