一尘不染

如何使Elastic Engine理解将不分析字段以进行精确匹配?

elasticsearch

这个问题是基于之前的帖子,其中“” Match或“”都无法进行“精确搜索”
MatchPhrasePrefix

然后,我在这里找到了类似的帖子,其中在映射定义中将搜索字段设置为not_analyzed(通过@Russ Cam)。

但是我正在使用

package id="Elasticsearch.Net" version="7.6.0" targetFramework="net461"
 package id="NEST" version="7.6.0" targetFramework="net461"

可能是因为该原因该解决方案无法正常工作。

因为如果我通过“ SOME”,它将与“SOME”和“SOMEOTHERLOAN”相匹配,但情况并非如此(在我先前的文章中为“ productvalue”)。

如何使用NEST 7.6.0做同样的事情?


阅读 273

收藏
2020-06-22

共1个答案

一尘不染

好吧,我不知道您当前的映射看起来如何。我也不太了解NEST,但我会解释

如何使Elastic Engine理解将不分析字段以进行精确匹配?

以使用弹性dsl为例。

对于完全匹配(区分大小写),您要做的就是将字段类型定义为keyword。对于类型为字段keyword的数据,无需应用任何分析器即可对其进行索引,因此非常适合精确匹配。

PUT test
{
  "mappings": {
    "properties": {
      "field1": {
        "type": "keyword"
      }
    }
  }
}

现在让索引一些文档

POST test/_doc/1
{
  "field1":"SOME"
}

POST test/_doc/2
{
  "field1": "SOME OTHER LOAN"
}

为了精确匹配,我们可以使用术语查询。让我们搜索“ SOME”,我们应该得到文档1。

GET test/_search
{
  "query": {
    "term": {
      "field1": "SOME"
    }
  }
}

我们得到的O / P:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.6931472,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.6931472,
        "_source" : {
          "field1" : "SOME"
        }
      }
    ]
  }
}

因此,关键是使字段类型成为keyword和使用term查询。

2020-06-22