Elasticsearch новичок, автозаполнение по адресу - PullRequest
0 голосов
/ 27 июня 2018

Я довольно новичок в ElasticSearch. Я пробовал большинство учебников и посмотрел на форуме, но я не могу найти хорошее решение. В качестве обходного пути я кормлю с использованием R и эластичного пакета, а Elastic API соединяется с помощью Laravel / PHP.

Я пытаюсь создать индекс геокодирования со всеми адресами во Франции, чтобы:

1) автозаполнение адреса

2) адрес геокода

После многих тестов я выбрал nGram, потому что из-за многих проблем при обработке комбинированного запроса текста и цифр с другими или у меня не было ожидаемого поведения или результатов.

Моя проблема в том, что завершение завершается неудачно для длинного запроса или недостаточно терпимо.

Допустим, в автозаполнении я хочу выбрать "11, rue de douai 75009 Paris".

Я получу его со следующими запросами:

11, rue de d
rue de douai

Но следующие запросы не будут иметь результатов:

11 доуай

11, Рю де До

rue de douai 75

rue de douai 11

за 11 улиц Фобура

11 rue du works 11 rue du f не работает без результата

Рю дю Фобур работает rue du faubourg p не работает без результата

Фобургские работы писателя faubourg poissionere не работает без результатов

Моя конфигурация индекса следующая



    "settings": {
        "analysis": {
          "analyzer": {
            "completion_analyzer": {
              "type": "custom",
              "filter": [
                "lowercase",
                "asciifolding",
                "trim",
                "completion_filter"
              ],
              "tokenizer": "keyword"
            }
          },
          "filter": {
            "completion_filter": {
            "type": "nGram",
            "min_gram": 2,
            "max_gram": 20,
            "token_chars": [ "letter", "digit", "punctuation" ]
          }
        }
      }
    },
    "mappings": {
      "geocoding": {
        "properties": {
          "numero": {
            "type": "long"
          },
          "nom_voie": {
            "type": "text"
          },
          "ville": {
            "type": "text"
          },
          "code_postal": {
            "type": "text"
          },
          "code_insee": {
            "type": "text"
          },
          "lon": {
            "type": "float"
          },
          "lat": {
            "type": "float"
          },
          "full_address": {
            "type": "text"
          },
          "address_suggest": {
            "type": "completion",
            "max_input_length" : 150,
            "analyzer": "completion_analyzer",
            "search_analyzer": "standard",
            "preserve_position_increments": false
          }
        }
      }
    }
    }

Я вставил данные следующим образом:

<code>
{
    "numero" : 11,
    "nom_voie" : "rue du faubourg poissonière",
    "code_postal" : "75008",
    "code_insee" : "75108",
    "ville" : "PARIS",
    "lon" : 2.37352,
    "lat" : 48.85759,
    "full_address" : "11, rue du faubourg poissonière 75008 PARIS",
    "address_suggest" : "11 rue du faubourg poissonière 75008 PARIS",
    "weight" : 2,
}

Запрос сделан следующим образом:

<code>
{
    "_source" : "full_address",
    "suggest" : {
        "text" : query,
        "completion" : {
            "field" : "address_suggest",
            "size" : 5,
            "skip_duplicates" : TRUE,
            "fuzzy" : {
                "fuzziness" : 5
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

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

Я бы хотел что-то такое же гладкое, как, например, в Deliveryroo. Еще не достигнуто!

0 голосов
/ 28 июня 2018

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

Я опробовал несколько встроенных подсказок, но подсказка завершение заставила пользователей начинать с правильного слова / термина, в то время как фраза term и подсказки были полезны для исправления орфографических ошибок в одном или нескольких словах, но никогда не возвращали все поле, которое они соответствовали.

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

Используя ваши имена полей, запрос будет выглядеть так:

{
  "from": 0,
  "size": 5,
  "_source": [
    "full_address"
  ],
  "query": {
    "match": {
      "full_address": {
        "query": query,
        "fuzziness": 5,
        "operator": "and"
      }
    }
  }
}

Я сам новичок в Elasticsearch, поэтому я передам кого-то более опытного, на случай, если я просто неправильно использовал подсказки. Но я дословно следил за документацией и не мог заставить никого из них вернуть все совпадающее поле, с совпадениями, разрешенными в любом месте поля.

...