Несколько токенизаторов в одном Custom Analyzer в Elasticsearch - PullRequest
0 голосов
/ 28 сентября 2018

Я использую Custom NGRAM Analyzer с токенайзером ngram.Я также использовал строчный фильтр.Запрос работает нормально для поиска без символов.Но когда я ищу определенные символы, это терпит неудачу.Поскольку я использовал строчные токены, Elasticsearch не анализирует символы.Я знаю, что пробел может помочь мне решить проблему.Как я могу использовать два токенизатора в одном анализаторе? Ниже приведено сопоставление:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer":"my_tokenizer",
          "filter":"lowercase"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 3,
          "token_chars": [
            "letter", 
            "digit"
          ]
        }
      }
    }
  },
    "mappings": {
    "_doc": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "my_analyzer"
        }
      }
    }
  }

}

Есть ли способ решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

1) Вы можете попробовать обновить token_chars, как показано ниже:

      "token_chars":[
        "letter",
        "digit",
        "symbol",
        "punctuation"
      ]

2) Если не работает, попробуйте следующий анализатор:

{
  "settings":{
    "analysis":{
      "filter":{
        "my_filter":{
          "type":"ngram",
          "min_gram":3,
          "max_gram":3,
          "token_chars":[
            "letter",
            "digit",
            "symbol",
            "punctuation"
          ]
        }
      },
      "analyzer":{
        "my_analyzer":{
          "type":"custom",
          "tokenizer":"keyword",
          "filter":[
            "lowercase",
            "like_filter"
          ]
        }
      }
    }
  },
  "mappings":{
    "_doc":{
      "properties":{
        "title":{
          "type":"text",
          "analyzer":"my_analyzer"
        }
      }
    }
  }
}

Вам необходимо использовать ключевое словотокенайзер ( ключевое слово токенайзер ) и затем токен-фильтр ngram в вашем анализаторе.

0 голосов
/ 28 сентября 2018

Согласно документации эластичного поиска,

В анализаторе должен быть ровно один токенизатор.

Однако в настройках можно определить несколько анализаторов, и вы можетенастроить отдельный анализатор для каждого поля.

Если вы хотите, чтобы само отдельное поле использовалось с использованием другого анализатора, один из вариантов - сделать это поле многопольным согласно этой ссылке

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "whitespace"
          "fields": {
            "ngram": { 
              "type":  "text",
              "analyzer": "my_analyzer"
            }
          }
        }
      }
    }
  }
}

Так что, если вы настроили как указано выше, ваш запрос должен использовать поля title и title.ngram.

GET my_index/_search
{
  "query": {
    "multi_match": {
      "query": "search @#$ whatever",
      "fields": [ 
        "title",
        "title.ngram"
      ],
      "type": "most_fields" 
    }
  }
}

В качестве другого варианта вы можете сделать следующее:

  • Создать два индекса.
  • Первый индекс имеет поле title с анализатором my_analyzer
  • Второй индекс имеет поле title с анализатором whitespace
  • Имеется такой же alias, созданный дляоба из них, как показано ниже

Выполните следующее:

POST _aliases
{  
   "actions":[  
      {  
         "add":{  
            "index":"index A",
            "alias":"index"
         }
      },
      {  
         "add":{  
            "index":"index B",
            "alias":"index"
         }
      }
   ]
}

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

Надеюсь, это поможет!

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