我在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"
}
我得到一个响应,表明令牌if
、a
、not
和已从提供的文本中删除:
{
"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?
值得一提的是,我配置的其他过滤器(小写和词干分析器)似乎按预期工作。这只会给我带来麻烦。
您就快到了。您只需要将您的描述
字段与您创建的客户分析器进行映射,如下所示。这将确保描述
字段的内容在索引和搜索时使用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会将最