Как выделить символы в словах, используя - PullRequest
2 голосов
/ 13 января 2020

Я реализовал автоматическое предложение с использованием elasti c search, где я даю предложения пользователям на основе введенного значения 'where'.
Большая часть части работает нормально, если я набираю полное слово или несколько начальных символов слова.
Я хочу выделить определенные c символы, набранные пользователем, скажем, например, пользовательские типы 'ca', тогда в предложениях следует выделить только ' Ca lifornia', а не целое слово ' California '
В теге Highlight должен отображаться результат, подобный <b>Ca</b>lifornia, а не <b>California</b>.

Вот мои настройки индекса

 {
      "settings": {
        "index": {
          "analysis": {
            "filter": {
              "edge_filter": {
                "type": "edge_ngram",
                "min_gram": 1,
                "max_gram": 50
              },
              "lowercase_filter":{
                "type":"lowercase",
                "language": "greek"
              },
              "metro_synonym": {
                "type": "synonym",
                "synonyms_path": "metro_synonyms.txt"
              },
              "profession_specialty_synonym": {
                "type": "synonym",
                "synonyms_path": "profession_specialty_synonyms.txt"
              }
            },
            "analyzer": {
              "auto_suggest_analyzer": {
                "filter": [
                  "lowercase",
                  "edge_filter"
                ],
                "type": "custom",
                "tokenizer": "whitespace"
              },
              "auto_suggest_search_analyzer": {
                "filter": [
                  "lowercase"
                ],
                "type": "custom",
                "tokenizer": "whitespace"
              },
              "lowercase": {
                "filter": [
                  "trim",
                  "lowercase"
                ],
                "type": "custom",
                "tokenizer": "keyword"
              }
            }
          }
        }
      },
      "mappings": {
        "properties": {
          "what_auto_suggest": {
            "type": "text",
            "analyzer": "auto_suggest_analyzer",
            "search_analyzer": "auto_suggest_search_analyzer",
            "fields": {
              "raw":{
                "type":"keyword"
              }
            }
          },
          "company": {
            "type": "text",
            "analyzer": "lowercase"
          },
          "where_auto_suggest": {
            "type": "text",
            "analyzer": "auto_suggest_analyzer",
            "search_analyzer": "auto_suggest_search_analyzer",
            "fields": {
              "raw":{
                "type":"keyword"
              }
            }
          },
          "tags_auto_suggest": {
            "type": "text",
            "analyzer": "auto_suggest_analyzer",
            "search_analyzer": "auto_suggest_search_analyzer",
            "fields": {
              "raw":{
                "type":"keyword"
              }
            }
          }
        }
      }
    }


Запрос я использовать для извлечения предложений -

GET /autosuggest_index_test/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "where_auto_suggest": {
              "query": "ca",
              "operator": "and"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "NAME": {
      "terms": {
        "field": "where_auto_suggest.raw",
        "size": 10
      }
    }
  },
  "highlight": {
    "pre_tags": [
      "<b>"
    ],
    "post_tags": [
      "</b>"
    ],
    "fields": {
      "where_auto_suggest": {
      }
    }
  }
}


Один из json полученных результатов -

  {
    "_index" : "autosuggest_index_test",
    "_type" : "_doc",
    "_id" : "Calabasas CA",
    "_score" : 5.755663,
    "_source" : {
      "where_auto_suggest" : "Calabasas CA"
    },
    "highlight" : {
      "where_auto_suggest" : [
        "<b>Calabasas</b> <b>CA</b>"
      ]
    }
  }

Может кто-нибудь подсказать, как получить вывод здесь (в where_auto_suggest) как - "<b>Ca</b>labasas <b>CA</b>"

1 Ответ

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

Я не знаю, почему, но если вы используете токенайзер edge_ngram вместо фильтра edge_ngram, у вас будут выделенные символы вместо выделенных слов.

Таким образом, в ваших настройках вы можете объявить такой токенизатор:

"settings": {
    "index": {
        "analysis": {
            "tokenizer": {
                "edge_tokenizer": {
                    "type": "edge_ngram",
                    "min_gram": 1,
                    "max_gram": 50,
                    "token_chars": [
                        "letter",
                        "digit",
                        "punctuation",
                        "symbol"
                    ]
                }
            },
            ...
        }
    }
}

и изменить свой анализатор на:

"analyzer": {
    "auto_suggest_analyzer": {
        "filter": [
            "lowercase"
        ],
        "type": "custom",
        "tokenizer": "edge_tokenizer"
    }
    ...
}

Таким образом, ваш пример запроса вернет

{
    ...
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.2876821,
        "hits": [
            {
                "_index": "autosuggest_index_test",
                "_type": "_doc",
                "_id": "grIzo28BY9R4-IxJhcFv",
                "_score": 0.2876821,
                "_source": {
                    "where_auto_suggest": "california"
                },
                "highlight": {
                    "where_auto_suggest": [
                        "<b>ca</b>lifornia"
                    ]
                }
            }
        ]
    }
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...