ElasticSearch подсказка завершения Стандартный анализатор не работает

Мы используем подсказку завершения ElasticSearch со стандартным анализатором, но кажется, что текст не разбит на токены.

например

Тексты: "Первый пример", "Второй пример"

Поиск: "Fi" возвращает "Первый пример"

В то время как

Поиск: "Ex" не возвращает никакого результата, возвращает "Первый пример"

3 ответа

Как документ Elastic о подсказчике завершения:

Подсказка завершения - это так называемая подсказка префикса.

Поэтому, когда вы отправляете ключевое слово, оно будет искать префикс ваших текстов.

Например:

Поиск: "Fi" => "Первый пример"

Поиск: "Sec" => "Второй пример"

но если вы дадите Elastic "Ex", он ничего не возвращает, потому что не может найти текст, который начинается с "Ex".

Вы можете попробовать другие предложения, такие как: термин предложение

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

Пример:

PUT /example
{
    "mappings": {
        "doc": {
            "properties": {
                "full": {
                    "type": "completion"
                },
                "tokens": {
                    "type": "completion"
                }
            }
        }
    }
}

POST /example/doc/_bulk
{ "index":{} }
{"full": {"input": "First Example"}, "tokens": {"input": ["First", "Example"]}}
{ "index":{} }
{"full": {"input": "Second Example"}, "tokens": {"input": ["Second", "Example"]}}

POST /example/_search
{
    "suggest": {
        "full-suggestion": {
            "prefix" : "Ex", 
            "completion" : { 
                "field" : "full",
                "fuzzy": true
            }
        },
        "token-suggestion": {
            "prefix": "Ex",
            "completion" : { 
                "field" : "tokens",
                "fuzzy": true
            }
        }
    }
}

Результат поиска:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": 0,
    "hits": []
  },
  "suggest": {
    "full-suggestion": [
      {
        "text": "Ex",
        "offset": 0,
        "length": 2,
        "options": []
      }
    ],
    "token-suggestion": [
      {
        "text": "Ex",
        "offset": 0,
        "length": 2,
        "options": [
          {
            "text": "Example",
            "_index": "example",
            "_type": "doc",
            "_id": "Ikvk62ABd4o_n4U8G5yF",
            "_score": 2,
            "_source": {
              "full": {
                "input": "First Example"
              },
              "tokens": {
                "input": [
                  "First",
                  "Example"
                ]
              }
            }
          },
          {
            "text": "Example",
            "_index": "example",
            "_type": "doc",
            "_id": "I0vk62ABd4o_n4U8G5yF",
            "_score": 2,
            "_source": {
              "full": {
                "input": "Second Example"
              },
              "tokens": {
                "input": [
                  "Second",
                  "Example"
                ]
              }
            }
          }
        ]
      }
    ]
  }
}

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

      PUT example
{
  "settings": {
    "index.max_shingle_diff": 10,
    "analysis": {
      "filter": {
        "after_last_space": {
          "type": "pattern_replace",
          "pattern": "(.* )",
          "replacement": ""
        },
        "preserve_only_first": {
          "type": "predicate_token_filter",
          "script": {
            "source": "token.position == 0"
          }
        },
        "big_shingling": {
          "type": "shingle",
          "min_shingle_size": 2,
          "max_shingle_size": 10,
          "output_unigrams": true
        }
      },
      "analyzer": {
        "dark_magic": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "big_shingling",
            "preserve_only_first",
            "after_last_space"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "suggest": {
        "type": "completion",
        "analyzer": "dark_magic",
        "search_analyzer": "standard"
      }
    }
  }
}

Этот хак работает для коротких строк (в примере до 10 токенов).

Другие вопросы по тегам