如何让 Elastic Engine 理解一个字段不被分析为完全匹配?

How to make Elastic Engine understand a field is not to be analyzed for an exact match?

问题基于 ,其中基于 MatchMatchPhrasePrefix 的精确搜索不起作用。

然后我发现了一种类似的post ,其中搜索字段在映射定义中设置为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" 和 "SOME OTHER LOAN" 匹配,而这不应该是这种情况(在我之前的 post 中 "product value" ).

如何使用 NEST 7.6.0 执行相同的操作?

嗯,我不知道您当前的映射是什么样子。我也不知道 NEST,但我会解释

How to make Elastic Engine understand a field is not to be analyzed for an exact match?

通过使用弹性 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查询。