如何在弹性搜索中查询单词的替代拼写和表示



我使用弹性搜索来查询文档中的theme字段。例如:

[
{ theme: 'landcover' },
{ theme: 'land cover' },
{ theme: 'land-cover' },
etc
]

我想指定搜索与所有这些文档匹配的术语landcover。我该怎么做?

到目前为止,我已经尝试在match搜索和模糊查询中使用模糊运算符。然而,这两种方法似乎都不起作用,这让我感到惊讶,因为我对模糊搜索的理解是,它们将提供一种不精确匹配的方法。

我错过了什么?从文档中,我看到模糊性肯定是在寻找搜索术语的近似值:

查询文本或关键字字段时,模糊性被解释为Levenstein编辑距离—需要对一个字符串进行一个字符的更改以使其与另一个字符串相同的次数。

我认为"土地覆盖"one_answers"土地覆盖率"接近。事实并非如此吗?(这是我第一次听说Levenstein编辑距离,所以我不知道额外/更少的字符在这个测量中意味着什么)。

匹配查询的一个例子似乎不起作用:

{
query: {
match: {
'theme': {
query: 'landcover'
fuzziness: 'AUTO' // I've tried 2, '2', 6, '6', etc.
},
},
},
}
// When the term is 'land-cover' and fuzziness is auto, then 'land cover' is matched. But 'landcover' is not

还有一个"模糊"查询似乎不起作用的例子:

{
query: {
fuzzy: {
'theme': {
value: query,
fuzziness: 'AUTO', // Tried other values
},
},
},
}
// When the term is 'land-cover' and fuzziness is auto, then 'landcover' is matched. But 'land cover' is not. So works almost opposite to the match query in this regard

(注意-这些查询被转换为JSON,并运行并返回合理的结果,只是模糊性似乎没有像我预期的那样起作用)

环顾StackOverflow,我看到了一些问题,这些问题似乎表明查询索引在某种程度上与索引的创建方式有关——也就是说,我不能只对任何已经存在的索引运行即席查询并期待结果。这是正确的吗?(对不起,我是弹性搜索的新手,正在查询一个已经存在的索引)。

这个答案似乎是相关的(如何找到搜索词的近似匹配项):https://stackoverflow.com/a/55772800/3114742-提到我应该在索引数据之前做一些被称为"字段映射"的事情。但是该示例查询不包括CCD_ 4运算符。所以在这种情况下,我很困惑模糊算子的意义到底是什么。

查看更多文档,我发现以下内容:

Elasticsearch使用了"索引"的概念,而不是数据库。但从熟悉CouchDB和MongoDB这两种JSON存储的人的角度来看,CouchDB数据库和Elasticsearch索引之间肯定有一些相似之处。尽管弹性搜索索引本身并不是权威的数据存储(它是从数据源"构建"而来的)。

例如,对于一个名为my-index的给定索引。您可以通过PUT向Elasticsearch:插入JSON字符串(文档)到my-index

PUT /... '{... json string ...}'

JSON字符串可以直接来自JSON存储(Mongo、Couch等),也可以从各种来源拼凑而成。我想。

Elasticsearch将在插入时处理文档,并将其附加到倒置的树中。对于文本字段,这意味着K:V对将从JSON文档文本中创建,键是文本的片段,值是对该文本片段在源(JSON文档)中的引用。

换句话说,当将文档插入Elasticsearch索引时,会对内容进行"分析",以创建添加到索引中的K:V对。

那么,我想搜索Elasticsearch意味着查找索引中的关键字搜索项,并将值(关键字的来源)与搜索中定义的来源进行比较(我认为),然后返回特定字段的搜索项所在的源文档。

因此:

  1. 插入索引时分析文本
  2. 分析查询(使用用于创建索引的相同分析器)

因此,在我的情况下(如上所述),默认分析器足以创建允许基本模糊匹配的指数(即,在匹配查询中,"土地覆盖"与"土地覆盖率"匹配,在模糊查询中,"土地覆盖率"与"地被覆盖率"匹配-我不知道为什么这些匹配不同!)

但是,为了改进搜索结果,我认为在将文档插入索引时,以及在解析要应用于索引的查询时,我都需要调整分析器/标记器。

我对分析/标记化的理解是,这是从源文档构建反向索引的配置。即定义反向索引的关键字。据我所知,搜索索引没有什么魔力。搜索项必须匹配反向索引中的关键字,否则将不会有结果。

我仍然不确定模糊性在这种情况下到底在做什么。

简而言之,查询弹性搜索似乎需要对源数据的索引方式和查询的设计方式有一个"整体的视角"。

不过,作为免责声明,我在这个问题上并不是一个权威的答案,我有不到一天的弹性搜索经验,所以如果有更好的答案,我们将不胜感激!

最新更新