эластичный поиск edgengram copy_to поле частичный поиск не работает - PullRequest
0 голосов
/ 29 мая 2018

Ниже приведено упругое сопоставление поиска с одним полем с именем хоста и другим полем с именем catch_all, которое по сути является полем copy_to (будет много других полей, копирующих значения в него)

{
  "settings": {
    "analysis": {
            "filter": {
                "myNGramFilter": {
                  "type": "edgeNGram",
                  "min_gram": 1,
                  "max_gram": 40
            }},
            "analyzer": {
                "myNGramAnalyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": ["lowercase", "myNGramFilter"]
                }
            }
        }
  },
    "mappings": {
      "test": {
        "properties": {
          "catch_all": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "store": true,
                            "ignore_above": 256
                        },
                        "grams": {
                            "type": "text",
                            "store": true,
                            "analyzer": "myNGramAnalyzer"
                        }
                    }
          },
          "hostname": {
            "type": "text",
            "copy_to": "catch_all"
          }
        }
      }
    }
}

Когда я сделаю

GET index/_analyze
{
  "analyzer": "myNGramAnalyzer",
  "text": "Dell PowerEdge R630"
}
{
  "tokens": [
    {
      "token": "d",
      "start_offset": 0,
      "end_offset": 4,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "de",
      "start_offset": 0,
      "end_offset": 4,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "del",
      "start_offset": 0,
      "end_offset": 4,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "dell",
      "start_offset": 0,
      "end_offset": 4,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "p",
      "start_offset": 5,
      "end_offset": 14,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "po",
      "start_offset": 5,
      "end_offset": 14,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "pow",
      "start_offset": 5,
      "end_offset": 14,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "powe",
      "start_offset": 5,
      "end_offset": 14,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "power",
      "start_offset": 5,
      "end_offset": 14,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "powere",
      "start_offset": 5,
      "end_offset": 14,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "powered",
      "start_offset": 5,
      "end_offset": 14,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "poweredg",
      "start_offset": 5,
      "end_offset": 14,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "poweredge",
      "start_offset": 5,
      "end_offset": 14,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "r",
      "start_offset": 15,
      "end_offset": 19,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "r6",
      "start_offset": 15,
      "end_offset": 19,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "r63",
      "start_offset": 15,
      "end_offset": 19,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "r630",
      "start_offset": 15,
      "end_offset": 19,
      "type": "<ALPHANUM>",
      "position": 2
    }
  ]
}

Существует токен, называемый "poweredge".Прямо сейчас мы ищем по запросу ниже

{ 
  "query": {
    "multi_match": {
      "fields": ["catch_all.grams"],
      "query": "poweredge",
      "operator": "and"
    }
  }
}

Когда мы запрашиваем "poweredge", мы получаем 1 результат.Но когда мы ищем только по «краю», результат не получается.

Даже запрос на совпадение не дает результатов для поискового слова «край».

Может ли кто-нибудь помочь здесь?

1 Ответ

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

Я предлагаю не запрашивать API multi_match для вашего варианта использования, а использовать запрос на совпадение.Edgengram работает следующим образом: он пытается создать ngram для токенов, сгенерированных символом пробела для вашего текста.Как написано в документации - читайте здесь :

Токенайзер edge_ngram сначала разбивает текст на слова всякий раз, когда встречает один из указанных символов, а затем выдает N-граммыкаждое слово, где начало N-граммы привязано к началу слова.

Как вы уже проверяли в своем запросе для анализа API, оно не дает "преимущество" продукта - от poweredge- как ngram, потому что он производит ngram с начала слова - посмотрите на результаты анализа API-вызова.Взгляните сюда: https://www.elastic.co/guide/en/elasticsearch/guide/master/ngrams-compound-words.html

...