Не удалось найти поле geo_point с помощью @Spatial из поиска в спящем режиме - PullRequest
0 голосов
/ 21 сентября 2018

Мне нужно реализовать решение, которое направлено на фильтрацию одного из моих поисковых запросов по местоположению.Здесь вы найдете мою сущность и то, как я использовал аннотацию @Spatial:

@Entity
@Indexed
@Spatial(spatialMode = SpatialMode.RANGE)
@Table(name = "ORGANIZATION", uniqueConstraints = { @UniqueConstraint(columnNames = { "CODE" }) })
public class Organization implements Serializable, FileEntity {

    ...

    @Latitude
    @Column(name = "LATITUDE")
    private Double latitude;

    @Longitude
    @Column(name = "LONGITUDE")
    private Double longitude;

   ...

}

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

GET http://localhost:9201/com.supralog.lexis.model.organization.organization
{
    "com.supralog.lexis.model.organization.organization" : {
        "aliases" : { },
        "mappings" : {
        "com.supralog.lexis.model.organization.Organization" : {
            "properties" : {
                "_hibernate_default_coordinates" : {
                    "properties" : {
                        "lat" : {
                            "type" : "float"
                        },
                        "lon" : {
                            "type" : "float"
                        }
                    }
                },
                ...
            }
        }
    }
}

GET http://localhost:9201/com.supralog.lexis.model.organization.organization/_search?from=0&size=1
{
    "took" : 1,
    "timed_out" : false,
    "_shards" : {
        "total" : 5,
        "successful" : 5,
        "skipped" : 0,
        "failed" : 0
    },
    "hits" : {
       "total" : 15628,
       "max_score" : 1.0,
       "hits" : [
           {
               "_index" : "com.supralog.lexis.model.organization.organization",
               "_type" : "com.supralog.lexis.model.organization.Organization",
               "_id" : "...",
               "_score" : 1.0,
               "_source" : {
                   ...
                   "_hibernate_default_coordinates" : {
                       "lat" : 49.1886203,
                       "lon" : -0.38740259999997306
                   },
                   ...
               }
           }
       ]
   }
}

После проверки индексации все в порядке, я попытался запросить все объекты организации в пределах заданного радиуса 100 км:

    final Coordinates coordinates = Point.fromDegrees(form.getLatitude(), form.getLongitude());
    final String search = StringUtils.join(terms, " ");

    final FullTextSession fullTextSession = Search.getFullTextSession(sessionFactory.getCurrentSession());
    final QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder()
            .forEntity(Organization.class).get();

    final org.apache.lucene.search.Query elasticQuery = queryBuilder.spatial().within(100,Unit.KM).ofCoordinates(coordinates).createQuery();

    final FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(elasticQuery, Organization.class);
    fullTextQuery.setMaxResults(form.getMaximumNumberOfResult());
    fullTextQuery.setProjection(FullTextQuery.THIS, FullTextQuery.SCORE);

И моя проблема здесь, когда я пытаюсь выполнить этот запрос, яимея следующее выражение return:

Request: POST /com.supralog.lexis.model.organization.organization/_search with parameters {from=0, size=50}
Response: 400 'Bad Request' with body 
{
    "error": {
        "root_cause": [
            {
                "type": "query_shard_exception",
                "reason": "failed to find geo_point field [_hibernate_default_coordinates]",
                "index_uuid": "phOfJTOyRvetHyZrfeUmrA",
                "index": "com.supralog.lexis.model.organization.organization"
            }
        ],
        "type": "search_phase_execution_exception",
        "reason": "all shards failed",
        "phase": "query",
        "grouped": true,
        "failed_shards": [
            {
                "shard": 0,
                "index": "com.supralog.lexis.model.organization.organization",
                "node": "9DCzSp6kS5KGtMq6tzywzg",
                "reason": {
                    "type": "query_shard_exception",
                    "reason": "failed to find geo_point field [_hibernate_default_coordinates]",
                    "index_uuid": "phOfJTOyRvetHyZrfeUmrA",
                    "index": "com.supralog.lexis.model.organization.organization"
                }
            }
        ]
    },
    "status": 400
}

Чтобы исправить это, я попытался присвоить имя @Spatial record, я пытался заставить мою сущность реализовывать координаты и т. д. Однако у меня всегда один и тот же результат,Похоже, что hibernate-search не индексирует мое местоположение как geo_point, причина, по которой он не выполняет запросы ...

Есть ли у вас какие-либо идеи о том, что я пропустил в документации?

Используемые версии:: спящий режим: 5,3;hibernate-поиск: 5.10;эластичный поиск: 5,6

1 Ответ

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

Неправильное сопоставление Elasticsearch:

    "com.supralog.lexis.model.organization.Organization" : {
        "properties" : {
            "_hibernate_default_coordinates" : {
                "properties" : {
                    "lat" : {
                        "type" : "float"
                    },
                    "lon" : {
                        "type" : "float"
                    }
                }
            },
            ...
        }
    }

Тот факт, что в "_hibernate_default_coordinates" есть атрибут "properties", означает, что "_hibernate_default_coordinates" имеет тип "object", тогда как он должен иметь тип "geo_point ".

Наиболее вероятным объяснением является то, что вы не сгенерировали схему до индексации, и Elasticsearch попытался автоматически сгенерировать ее на лету на основе полученных документов.Как видите, это очень плохая идея, так как риск того, что Elasticsearch угадывает неправильную схему, достаточно высок.

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

Короче говоря, поместите в hibernate.properties следующее:

В среде разработки: Hibernate Search попробует еелучше, но может дать сбой, и данные не будут переиндексированы волшебным образом, вам придется сделать это самостоятельно

hibernate.search.default.elasticsearch.index_schema_management_strategy update

В производственной среде: вам придется самостоятельно тщательно обновить схему и спланировать массовая переиндексация при обновлении приложения.

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