Неожиданные результаты при использовании запроса терминов в специальном ключевом поле со специальными символами - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть индекс со следующим полем:

myField: {
    type: "text",
    fields: {
        keyword: {
            type: "keyword",
            ignore_above: 256
        },
        keyword_lowercase: {
            type: "text",
            analyzer: "lowercase_keyword_analyzer",
            fielddata: true
        }
    },
    analyzer: "autocomplete_analyzer",
    search_analyzer: "autocomplete_search_analyzer"
},

Анализаторы:

lowercase_keyword_analyzer: {
    filter: [
        "lowercase",
        "asciifolding"
    ],
    type: "custom",
    tokenizer: "keyword"
},
autocomplete_search_analyzer: {
    filter: [
        "lowercase",
        "asciifolding"
    ],
    type: "custom",
    tokenizer: "standard"
},
autocomplete_analyzer: {
    filter: [
        "lowercase",
        "asciifolding",
        "autocomplete_edge_ngram"
    ],
    type: "custom",
    tokenizer: "standard"
}

У меня есть документ со значением: L'OCCITANE

A Запрос MATCH:

"query": {
    "bool": {
        "should": [
        {
            "match": {
                "myField.keyword_lowercase": {
                    "query": "l’occitane"
                }
            }
        }]
    }
}

Находит его, однако запрос TERM:

"query": {
    "bool": {
        "should": [
        {
            "term": {
                "myField.keyword_lowercase": {
                    "value": "l’occitane"
                }
            }
        }]
    }
}

Нет. Странно, если я поменяю апостроф с «это в документе» на:

"query": {
    "bool": {
        "should": [
        {
            "term": {
                "myField.keyword_lowercase": {
                    "value": "l'occitane"
                }
            }
        }]
    }
}

Теперь поиск термина работает. Я нахожу эту проблему с другими словами со специальными символами, насколько я понимаю, фильтр асцифолдинга должен предотвращать это.

Что здесь происходит?

1 Ответ

1 голос
/ 06 апреля 2020

Это довольно трудно увидеть, но это, как вы сказали, два вида апострофов. Я бы сказал, что один из них - single quote, французский - apostrophe.

. Индексация их обоих по отдельности

POST mag/_doc
{"myField": "l'occitane"}

POST mag/_doc
{"myField":"l’occitane"}

, а затем агрегирование по анализу ключевое слово:

GET mag/_search
{
  "aggs": {
    "by_terms": {
      "terms": {
        "field": "myField.keyword_lowercase"
      }
    }
  }
}

с результатом

"buckets" : [
        {
          "key" : "l'occitane",
          "doc_count" : 2
        }
      ]

, что означает, что сборщик асцифолдинга преобразовал apostrophe в single-quote, и так как запрос термина работает с точными значениями в инвертированный индекс, вы не сможете запросить с помощью apostrophe. Вам нужно будет go с

...
        {
          "term": {
            "myField.keyword_lowercase": {
              "value": "l'occitane"
            }
          }
        }
...

Если вы хотите применить запрос термина в нижнем регистре, вам нужно удалить ашифолдинг или добавить другое поле отображения внутри myField без вышеупомянутого ашифолдинга , Таким образом, запрос myField.keyword_lowercase_no_ascii будет работать с апострофами.

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