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

ElasticSearch分析的字段

云炜
2023-03-14
问题内容

我正在建立搜索,但需要使用不同的分析器分析1个字段。我的问题是,对于一个字段,我需要在其上安装一个分析器以进行词干分析(雪球),然后还需要一个分析器将完整的单词保留为一个标记(关键字)。我可以通过以下索引设置来使其工作:

curl -X PUT "http://localhost:9200/$IndexName/" -d '{
    "settings":{
        "analysis":{
            "analyzer":{
                "analyzer1":{
                    "type":"custom",
                    "tokenizer":"keyword",
                    "filter":[ "standard", "lowercase", "stop", "snowball", "my_synonyms" ]
                }
            }
        },
        "filter": {
          "my_synonyms": {
           "type": "synonym",
           "synonyms_path ": "synonyms.txt"
          }
        }
      }
    },
    "mappings": {
        "product": {
            "properties": {
                "title": {
                    "type": "string",
                    "search_analyzer" : "analyzer1",
                    "index_analyzer" : "analyzer1"
                }
            }
        }
    }
}';

在标题字段中搜索单个单词时出现问题。如果其中装有“帽子里的猫”,它将存储为“帽子里的猫”,但是如果我搜索猫,我什么也得不到。

这是否有可能实现?还是我需要有2个单独的字段,并用关键字分析一个字段,而另一个则用雪球分析?

如果重要的话,我在vb代码中使用嵌套来索引数据。

谢谢罗伯特


问题答案:

您可以使用fields属性(以前称为multi
field
)将两个不同的分析器应用于同一分析器。

我的VB.NET有点生锈,所以希望您不要介意C#示例。如果您使用的是dev分支中的最新代码,那么Fields它只是添加到每个核心映射描述符中,因此您现在可以执行以下操作:

client.Map<Foo>(m => m
    .Properties(props => props
        .String(s => s
            .Name(o => o.Bar)
            .Analyzer("keyword")
            .Fields(fs => fs
                .String(f => f
                    .Name(o => o.Bar.Suffix("stemmed"))
                    .Analyzer("snowball")
                )
            )
        )
    )
);

否则,如果您使用的是NEST 1.0.2或更早版本(可能是),则必须通过较旧的multi field类型方法来完成此操作:

client.Map<Foo>(m => m
    .Properties(props => props
        .MultiField(mf => mf
            .Name(o => o.Bar)
            .Fields(fs => fs
                .String(s => s
                    .Name(o => o.Bar)
                    .Analyzer("keyword"))
                .String(s => s
                    .Name(o => o.Bar.Suffix("stemmed"))
                    .Analyzer("snowball"))
            )
        )
    )
);

Elasticsearch支持这两种方式,它们的作用完全相同。将keyword分析器应用于主bar字段,然后将snowball分析器应用于该bar.stemmed字段。
stemmed当然,这只是我在这些示例中选择的后缀,您可以使用所需的任何后缀名称。实际上,您不需要添加后缀,您可以为多字段命名与主字段完全不同的名称。



 类似资料:
  • 主要内容:分析器,令牌器/标记生成器,令牌过滤器,字符过滤器当在搜索操作期间处理查询时,任何索引中的内容由分析模块分析。该模块由分析器,分词器,分词器过滤器和字符过滤器组成。 如果没有定义分析器,则默认情况下注册内置的分析器,分词器,分词器过滤器和字符过滤器到分析模块。例如。 请求正文 响应 分析器 分析器由令牌器和可选的令牌过滤器组成。这些分析器在具有逻辑名的分析模块中注册,可以在映射定义或某些API中引用它们。有许多默认分析仪如下 - 编号 分析器 描

  • 我有一个带有标准分析器的弹性搜索集群。我知道使用这个分析仪,术语“300”被分析为一种类型。 假设我正在搜索一个具有字段“name”的文档,该字段的值为“纸巾300 CT”,分析为[“Paper”(ALPHANUM)、“tower”(ALPHANUM)、“300”(NUM)、“CT”(ALPHANUM)] 目前,当我使用模糊/通配符查询时,如下所示: 无论模糊性如何调整,模糊查询都不匹配。我希望术

  • 问题内容: 有没有办法让ElasticSearch在分析的字段上识别完全匹配?理想情况下,我想小写,标记化,词干化,甚至对我的文档进行语音化,然后让查询提取“精确”匹配项。 我的意思是,如果我索引“汉堡包”和“汉堡包”,它们将被分析为[“汉堡包”,“小圆面包”]和[“汉堡包”]。如果我搜索“汉堡”,它将仅返回“汉堡”文档,因为这是“完全匹配”。 我尝试使用关键字标记器,但不会阻止各个标记。我是否需

  • 问题内容: 我在理解带轮胎宝石的elasticsearch中分析仪的概念时遇到了麻烦。我实际上是这些搜索概念的新手。这里有人可以帮我提供一些参考文章还是解释一下分析仪的实际作用以及为什么要使用它们? 我看到在Elasticsearch中提到了不同的分析器,例如关键字,标准,简单,滚雪球。没有分析仪的知识,我无法确定真正适合我的需求。 问题答案: 我给你一个简短的答案。 在索引时间和搜索时间使用分析

  • 问题内容: 我正在使用Elasticsearch 1.7.3累积用于分析报告的数据。 我有一个包含文档的索引,其中每个文档都有一个名为“ duration”的数字字段(请求花费了几毫秒)和一个名为“ component”的字符串字段。可能有许多具有相同组件名称的文档。 例如。 我想生成一份报告,说明每个组件: 此组件的所有“持续时间”字段的总和。 此总和在 所有 文档的总期限中所占的百分比。在我的

  • 问题内容: 是否可以将现有字段的属性从修改为? 如果没有,我该怎么办才能将我所有的文件保存起来? 我无法删除映射(因为所有文档都将消失),并且需要该旧字段进行分析。 问题答案: 不能修改现有字段,但是,您可以创建其他字段或子字段添加到您的领域。 我要使用后一种解决方案。因此,首先,将一个新的子字段添加到您现有的字段中,如下所示: 上面,我们已经添加了子场称为(被分析)现有的(这是) 接下来,我们需