Эластичный поиск игнорирует точку в match_phrase? - PullRequest
0 голосов
/ 17 января 2020

Я использую match_phrase для поиска, например:

"match_phrase": {
                            "name": "XX .S"
                          }

И он находит результат с именем "name" : "XX S&#", и "name": "XX S Ltd". Кажется, он игнорирует . в поиске. После некоторого исследования dot может быть полосатым во время индексации, когда он маркирует слова внутри строки. Если это правда, как я могу заставить поиск воспринимать dot как обычный символ? Если это не так, что является причиной и как я могу это исправить?

Я ожидаю, что я смогу получить ответ ниже, запросив XX .S

A XX .S B
XX .S
XX .S11
XX .Sa

Единственная проблема о match_phrase Я обнаружил, что это не ускользает .. Идеально подходит для других случаев.

Ответы [ 2 ]

1 голос
/ 17 января 2020

Вам нужно определить «имя» как тип ключевого слова при создании индекса. По умолчанию используется текстовый тип, который будет маркирован поисковой системой Elasti c.

name": {
    "type": "keyword"
}

Использовать подстановочный знак:

{
    "from": 0,
    "size": 200,
    "query": {
        "bool": {
            "filter": [
                {
                    "bool": {
                        "must": [
                            {
                                "wildcard": {
                                    "name": {
                                        "wildcard": "*XX .S*",
                                        "boost": 1
                                    }
                                }
                            }
                        ],
                        "adjust_pure_negative": true,
                        "boost": 1
                    }
                }
            ],
            "adjust_pure_negative": true,
            "boost": 1
        }
    },
    "_source": {
        "includes": [
            "name"
        ],
        "excludes": []
    }
}
0 голосов
/ 17 января 2020

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

{
  "foo": {
    "type" "text",
    "fields": {
      "raw": { 
        "type":  "keyword"
      }
    }
  }
}

И вы можете выполнить полнотекстовый поиск с полем foo.raw.

Это то, что вам нужно запросить, чтобы получить результаты

{
    "query": {
        "wildcard": {
            "foo.raw": "*XX .S*"
        }
    }
}

Подробнее см. На https://www.elastic.co/guide/en/elasticsearch/reference/7.5/multi-fields.html

Best,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...