Поиск без учета регистра с подстановочными знаками в Elasticsearch - PullRequest
0 голосов
/ 30 мая 2018

Я только начал работать над эластичным поиском.У меня есть индекс "new_index" с отображением, приведенным ниже:

"new_index" : {
    "aliases" : { },
    "mappings" : {
      "current" : {
        "properties" : {
          "did" : {
            "type" : "integer"
          },
          "fil_date" : {
            "type" : "double"
          },
          "file_nr" : {
            "type" : "double"
          },
          "id" : {
            "type" : "integer"
          },
          "mark_text" : {
            "type" : "text"
          },
          "mark_type_id" : {
            "type" : "text"
          },
          "markdescr" : {
            "type" : "text"
          },
          "markdescrtext" : {
            "type" : "text"
          },
          "niceclmain" : {
            "type" : "double"
          },
          "owname" : {
            "type" : "text"
          },
          "statusapplication" : {
            "type" : "text"
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1527665866982",
        "number_of_shards" : "5",
        "number_of_replicas" : "1",
        "uuid" : "Py5uWzVTRYqcZuCLcwm-BQ",
        "version" : {
          "created" : "6020499"
        },
        "provided_name" : "new_index"
      }
    }
  }

Теперь я хочу искать в поле "mark_text".У меня есть два типа поиска 1. Если я ищу «умный», результат должен содержать только слова без учета регистра «умный».2. Он должен искать, так как мы используем LIKE "% smart%", а также без учета регистра.

Я получил запрос для 2-го поискового случая.Но я хочу знать, есть ли какое-либо решение, которое можно использовать для обоих вариантов поиска.

РЕДАКТИРОВАТЬ : запрос, который я использую для случая поиска 1:

GET _search
{
  "query": {
    "bool": {
      "must" : [
        {
          "match": {
            "mark_text": "smart"
          }
        }  
      ]
    }
  }
}

Запрос для поискового запроса 2:

GET _search
{
  "query": {
    "bool": {
      "must" : [
        {
          "wildcard": {
            "mark_text": "*smart*"
          }
        }  
      ]
    }
  }
}

1 Ответ

0 голосов
/ 31 мая 2018

Я создал новый индекс и добавил отображение и настройки, как показано ниже:

{
  "new_index5" : {
    "aliases" : { },
    "mappings" : {
      "current" : {
        "properties" : {
          "did" : {
            "type" : "integer"
          },
          "fil_date" : {
            "type" : "double"
          },
          "file_nr" : {
            "type" : "double"
          },
          "filing_date" : {
            "type" : "double"
          },
          "id" : {
            "type" : "integer"
          },
          "mark_identification" : {
            "type" : "keyword",
            "normalizer" : "lowercase_normalizer"
          },
          "mark_text" : {
            "type" : "keyword",
            "normalizer" : "lowercase_normalizer"
          },
          "mark_type_id" : {
            "type" : "text"
          },
          "markdescr" : {
            "type" : "text"
          },
          "markdescrtext" : {
            "type" : "text"
          },
          "niceclmain" : {
            "type" : "double"
          },
          "owname" : {
            "type" : "keyword",
            "normalizer" : "lowercase_normalizer"
          },
          "party_name" : {
            "type" : "keyword",
            "normalizer" : "lowercase_normalizer"
          },
          "primary_code" : {
            "type" : "text"
          },
          "registration_date" : {
            "type" : "double"
          },
          "registration_number" : {
            "type" : "double"
          },
          "serial_number" : {
            "type" : "double"
          },
          "status_code" : {
            "type" : "text"
          },
          "statusapplication" : {
            "type" : "text"
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "number_of_shards" : "5",
        "provided_name" : "new_index5",
        "creation_date" : "1527686957833",
        "analysis" : {
          "normalizer" : {
            "lowercase_normalizer" : {
              "filter" : [
                "lowercase"
              ],
              "type" : "custom",
              "char_filter" : [ ]
            }
          }
        },
        "number_of_replicas" : "1",
        "uuid" : "9YdUrs1cSBuqDJmvSPOm6g",
        "version" : {
          "created" : "6020499"
        }
      }
    }
  }
} 

И добавил агрегацию в моем запросе для первого поискового случая, например:

GET _search
{
  "query": {
    "bool": {
      "must" : [
        {
          "match": {
              "mark_text": "smart"
          }
        }
      ]
    }
  },
  "aggs": {
    "mark_texts": {
      "terms": {
        "field": "mark_text"
      }
    }
  }
}

Это даетme результаты, включая «умный» и «умный» оба.

Для второго случая поиска я использую нечеткий.

Я до сих пор не знаю, как агрегация и нормализаторы решили мою проблему.Но я пытаюсь это понять.

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