Elasticsearch - выделение как ".keyword", так и текстовых полей - PullRequest
0 голосов
/ 19 ноября 2018

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

Я использую пробельные символы в качестве анализатора поиска.

Мой пользовательский анализатор:

"analysis": {
  "filter": {
    "indexFilter": {
      "type": "pattern_capture",
      "preserve_original": "true",
      "patterns": [
        "([@,$,%,&,!,.,#,^,*]+)",
        "([\\w,.]+)",
        "([\\w,@]+)",
        "([-]+)",
        "(\\w+)"
      ]
    }
  },
  "analyzer": {
    "indexAnalyzer": {
      "filter": [
        "indexFilter",
        "lowercase"
      ],
      "tokenizer": "whitespace"
    },
    "searchAnalyzer": {
      "filter": [
        "lowercase"
      ],
    "tokenizer": "whitespace"
  }
}

Мой файл сопоставления:

"field": {
  "type": "text",
  "term_vector": "with_positions_offsets",
  "fields": {
    "keyword": {
      "type": "keyword",
      "ignore_above": 256
    }
  },
  "analyzer": "indexAnalyzer",
  "search_analyzer": "searchAnalyzer"
}

Мой запрос:

{
  "from": 0,
  "size": 24,
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "monkey business",
            "type": "phrase",
            "slop": "2",
            "fields": []
          }
        }
      ],
      "minimum_should_match": 1
    }
  },
  "highlight": {
    "type": "unified",
    "fields": {
      "*": {}
    }
  }
}

Мои основные результаты:

"highlight": {
  "field.keyword": [
    "<em>monkey business</em>"
  ],
  "field": [
    "<em>monkey</em> <em>business</em>"
  ]
}

1 Ответ

0 голосов
/ 20 ноября 2018

Я могу предложить вам такой запрос (анализ и отображение остаются прежними):

GET /index-53370229/_doc/_search
{
  "from": 0,
  "size": 24,
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "monkey business",
            "type": "phrase",
            "slop": "2",
            "fields": []
          }
        }
      ],
      "minimum_should_match": 1
    }
  },
  "highlight": {
    "type": "fvh",
    "fields": {
      "field": {
        "matched_fields": [
          "field",
          "field.keyword"
        ]
      }
    }
  }
}

Единственное изменение - в разделе highlight. В результате вы получите:

"highlight": {
  "field": [
    "<em>monkey business</em>"
  ]
}

Я использовал matched_fields свойство, о котором вы можете прочитать в документации: https://www.elastic.co/guide/en/elasticsearch/reference/6.5/search-request-highlighting.html#matched-fields

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