Как заставить Elasti c Engine понимать, что поле не нужно анализировать на предмет точного соответствия? - PullRequest
0 голосов
/ 18 марта 2020

Вопрос основан на предыдущем посте , где Точный поиск не работал, либо на основе 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"

и может быть для этого Причина, по которой решение не сработало.

Потому что, если я передам «НЕКОТОРЫЙ», он будет соответствовать «НЕКОТОРЫМ» и «НЕКОТОРЫМ ДРУГИМ ЗАЙМАМ», что не должно иметь место (в моем предыдущем посте для «стоимости продукта»).

Как я могу сделать то же самое, используя NEST 7.6.0?

1 Ответ

1 голос
/ 19 марта 2020

Ну, я не знаю, как выглядит ваше текущее отображение. Также я не знаю о NEST, но я объясню

Как заставить Elasti c Engine понять, что поле не должно анализироваться на точное совпадение?

на примере использования elasti c dsl.

Для точного соответствия (с учетом регистра) все, что вам нужно сделать, это определить тип поля как keyword. Для поля типа keyword данные индексируются как есть, без применения какого-либо анализатора, и, следовательно, они идеально подходят для точного сопоставления.

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

Теперь давайте индексировать некоторые документы

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

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

Для точного соответствия мы можем использовать термин запрос. Давайте поищем «НЕКОТОРЫЕ», и мы должны получить документ 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 query.

...