当前位置: 首页 > 面试题库 >

应用分析器/过滤器时搜索elasticsearch错误

陶成化
2023-03-14
问题内容

我已经下载了包含技能分类法的onet数据集,并将其上传到了Elasticsearch中。在技​​能分类中,有一些技能,例如c ++ 、.
net,C#。我想给c#并且只获得c#的技能。通过检查一些链接,我已如下设置索引的映射和设置。

{
  "onnet_taxonomy": {
    "mappings": {
      "text": {
        "properties": {
          "Occupation": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "Skill": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "Skill Type": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      },
      "keywords": {
        "properties": {
          "Occupation": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "Skill": {
            "type": "text",
            "fields": {
              "analyzed": {
                "type": "text",
                "analyzer": "analyzer_keyword",
                "search_analyzer": "analyzer_shingle"
              },
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "Skill Type": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    },
    "settings": {
      "index": {
        "number_of_shards": "5",
        "provided_name": "onnet_taxonomy",
        "creation_date": "1583114276039",
        "analysis": {
          "filter": {
            "my_shingle_filter": {
              "max_shingle_size": "8",
              "min_shingle_size": "2",
              "output_unigrams": "true",
              "type": "shingle"
            }
          },
          "analyzer": {
            "analyzer_keyword": {
              "filter": [
                "lowercase"
              ],
              "char_filter": [
                "code_mapping"
              ],
              "type": "custom",
              "tokenizer": "keyword"
            },
            "analyzer_shingle": {
              "filter": [
                "lowercase",
                "my_shingle_filter"
              ],
              "char_filter": [
                "code_mapping"
              ],
              "tokenizer": "standard"
            }
          },
          "char_filter": {
            "code_mapping": {
              "type": "mapping",
              "mappings": [
                "++ => plusplus",
                "c# => csharp",
                "C# => csharp",
                "F# => fsharp",
                "f# => fsharp",
                ".net => dotnet",
                ".Net => dotnet",
                ".NET => dotnet",
                "( => map_lp",
                ") => map_rp",
                "& => and",
                "# => hash",
                "+ => plus"
              ]
            }
          }
        },
        "number_of_replicas": "1",
        "uuid": "LNf2frW1S8WmHSOJWVrvLA",
        "version": {
          "created": "5030399"
        }
      }
    }
  }
}

当我使用如下查询

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "Skill": "c++"
          }
        }
      ]
    }
  },
  "size": 10

我正在获得所有具有“ c”的技能

当我使用以下查询时假设应用了分析器

    {
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "Skill.analyzed": "c++"
          }
        }
      ]
    }
  },
  "size": 10
}

我得到空输出。我是否正确包括了分析仪,或者我的查询错误?


问题答案:

我只是简化了你的问题,为简单起见,我们假设你只需要1场被称为title包含了像不同的语言cc++c# f#

title字段的索引设置和映射。

{
    "settings": {
        "index": {
            "analysis": {
                "analyzer": {
                    "my_analyzer": {
                        "filter": [
                            "lowercase"
                        ],
                        "char_filter": [
                            "code_mapping"
                        ],
                        "tokenizer": "standard" --> notice `standard`
                    }
                },
                "char_filter": {
                    "code_mapping": {
                        "type": "mapping",
                        "mappings": [
                            "++ => plusplus",
                            "c# => csharp",
                            "C# => csharp",
                            "F# => fsharp",
                            "f# => fsharp",
                            ".net => dotnet",
                            ".Net => dotnet",
                            ".NET => dotnet",
                            "( => map_lp",
                            ") => map_rp",
                            "& => and",
                            "# => hash",
                            "+ => plus"
                        ]
                    }
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "title": {
                "type": "text",
                "analyzer": "my_analyzer" --> using custom analyzer created in settings
            }
        }
    }
}

为一些文档编制索引

POST / _doc / {doc-is}

{
    "title": "c#"
}
{
    "title": "c++"
}
{
    "title": "c"
}
{
    "title": "F#"
}

搜索查询,这是为您提供的问题中提取包含的所有记录的问题c

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "title": "c++"
                    }
                }
            ]
        }
    },
    "size": 10
}

现在对我而言,它仅检索仅包含c++我的搜索API结果中所示的文档。

"hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.9808292,
        "hits": [
            {
                "_index": "cplus",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.9808292,
                "_source": {
                    "title": "c++"
                }
            }
        ]
    }


 类似资料:
  • 问题内容: 我正在尝试搜索数据库,并能够使用大写/小写过滤器术语,但是我注意到在应用分析器时,我不知道如何在过滤后的搜索中应用小写分析器。这是查询: 我有一个小写的类型: 以及相应的映射: 问题答案: 问题是您在索引期间分析了一个字段以使其小写,但您正在对未分析的查询使用术语过滤器: 术语过滤器 筛选具有包含术语(未分析)的字段的文档。与术语查询类似,不同之处在于它充当过滤器。 http://ww

  • 问题内容: 我正在研究Elasticsearch 7.2版,并且正在 改善 应用程序发出的ES调用的性能。 根据我的阅读,如果我们尚未设置“搜索分析器”,则默认情况下将设置标准分析器。 但是,在不需要分析仪的情况下,安装分析仪可能会影响性能。是否将所有字段都用作“关键字”可以防止这种情况? 还是有其他方法可以禁用此“搜索分析器” 附言:对于任何答案,如果您能指出我基于答案的ES官方文档,我将不胜感

  • 我基本上是在尝试禁用小写过滤器,以便能够对文本字段进行区分大小写的匹配。按照索引和分析器文档,我创建了以下不带小写过滤器的映射: PUT/my_索引 我启用fielddata,以便在之后检查标记化 放置我的索引/\u映射/\u文档 我测试了自定义分析器,以确保它不像预期的那样是小写的 后 /my_index/analyze 得到以下响应 太好了,事情并没有像我想的那样变小。现在我试着插入相同的文本

  • 问题内容: 我正在使用Elasticsearch构建URL索引。 我将一个URL提取为3个部分,分别是“域”,“路径”和“查询”。 例如:将分为 当我想在索引中部分搜索域时出现问题,例如“ user = who”或“ ing.com”。 甚至在索引时没有使用“ Analyzer”时,是否可以使用“ Analyzer”? 如何基于分析仪进行部分搜索? 非常感谢你。 问题答案: 2种方法: 1.通配符

  • 问题内容: 我是这个框架的新手,因此练习Angularjs并遵循网站上提供的教程。 有一个示例,我们可以搜索表中存在的数据,示例如下, 在上面的代码中,我可以使用两个不同的输入来搜索手机,即按型号名称搜索和按公司名称搜索,以上代码运行良好, 但是,如果我需要使用选择选项中存在的搜索类型进行搜索,该怎么办? 代码如下 从上面的代码中,您可以看到我正在尝试通过选择框中显示的“姓名”,“公司”或“名称”

  • 问题内容: 在ES中是否在查询之前应用了过滤器? 举例来说,我正在做一个非常缓慢的模糊搜索,但是我只是在很小的日期范围内进行。例如,您可以看下面的(PHP): 在尝试进行较慢的搜索之前,是否会应用过滤器? 逻辑将要求先运行筛选器,然后再运行查询,但是我想确定一下。 问题答案: 如果使用-query,则会在对文档计分之前应用过滤器。 通常,这会大大加快速度。但是,模糊查询将仍然使用输入来构建更大的查