2

私はdjango 1.4、django-haystack 2.0、およびElasticsearch 0.19.1を使用しています。次のようなSearchIndexがあります。

from haystack import indexes
from core.models import Project

class ProjectIndex(indexes.RealTimeSearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    location = indexes.LocationField(model_attr='get_location')

    def get_model(self):
        return Project

そのようなプロジェクトモデル:

class Project(BaseModel):
    name = models.CharField(_(u'Proje Adı'), max_length=50)
    latitude = models.FloatField()
    longitude = models.FloatField()

    def get_location(self):
        # Remember, longitude FIRST!
        return Point(self.longitude, self.latitude)

だから私は近くから遠くまでの距離固有の座標で Project オブジェクトをクエリしたい:

....
location = Point(project.longitude, project.latitude)
projects = SearchQuerySet().models(Project).distance('location', location).order_by('distance')

しかし、私はこのエラーが発生しています:

' を使用して Elasticsearch にクエリを実行できませんでした:': u'SearchPhaseExecutionException[フェーズ [クエリ] を実行できませんでした。完全な失敗を含む非 OK ステータス コード (500) が返されました。shardFailures {[jmUkmHkDTX-bo9DhFJdtSw][skp][2]: QueryPhaseExecutionException[[skp][2]: クエリ[filtered(ConstantScore(NotDeleted(cache(QueryWrapperFilter(django_ct:core.project))))))->cache(_type :modelresult)],from[0],size[10],sort[]: クエリに失敗しました [メインクエリの実行に失敗しました]]; ネストされた: ElasticSearchIllegalArgumentException [フィールド [場所] は geo_point フィールドではありません]; }{[jmUkmHkDTX-bo9DhFJdtSw][skp][4]: QueryPhaseExecutionException[[skp][4]: クエリ[filtered(ConstantScore(NotDeleted(cache(QueryWrapperFilter(django_ct:core.project)))))->cache(_type :modelresult)],from[0],size[10],sort[]: クエリに失敗しました [メインクエリの実行に失敗しました]]; 入れ子: ElasticSearchIllegalArgumentException [フィールド [場所] は geo_point フィールドではありません]; }]'。

なにが問題ですか?

4

1 に答える 1

4

おそらく、ロケーションフィールドの「タイプ」の側面が正しくマッピングされていません。これは、マッピングに使用したAPIが原因である可能性があります。マッピングの一部の側面は変更できますが、フィールドの「タイプ」の側面は変更できません。そのため、geo_pointタイプのlocationフィールドを使用して新しいマッピングを作成し、ドキュメントのインデックスを再作成する必要があります。

于 2012-04-12T15:39:36.473 に答える