4

こんにちは私は検索エンジンとしてwooshでhaystackを使用しています:

私のモデルは次のようになります

class Person(models.Model):
    personid = models.IntegerField(primary_key = True, db_column = 'PID')  
    firstname = models.CharField(max_length = 50, db_column = 'FIRSTNAME')  
    lastname = models.CharField(max_length = 50, db_column = 'LASTNAME') 
    class Meta:
        db_table = '"TEST"."PERSON"'
        managed = False


class TDoc(models.Model):
    tdocid = models.IntegerField(primary_key = True, db_column = 'TDOCID')  
    person = models.ForeignKey(Person, db_column = 'PID')
    content = models.TextField(db_column = 'CONTENT', blank = True) 
    filepath = models.TextField(db_column = 'FILEPATH', blank = True) 
    class Meta:
        db_table = '"TEST"."TDOC"'
        managed = False

search_index.pyは次のとおりです。

class TDocIndex(SearchIndex):

    content = CharField(model_attr = 'content', document = True)
    filepaht = CharField(model_attr = 'filepath')
    person = CharField(model_attr = 'person')

    def get_queryset(self):
        return TDoc.objects.all()

    def prepare_person(self, obj):
        # Store a list of id's for filtering
        return obj.person.lastname

site.register(TDoc, TDocIndex)

私の問題は、次のような複数のファイル検索を実行したいことです。

content:xxx AND person:SMITH

干し草の山では、それらすべてを一度に検索します。特定のフィールド検索を行うことはできません。インデックスが破損していると思われましたが、次のようになりました。

ix = open_dir("/testindex")

searcher = ix.searcher()

mparser = MultifieldParser(["content", "filepath", "person"], schema = ix.schema)
myquery = mparser.parse(content:xxx AND person:SMITH')
results = searcher.search(myquery)
for result in results:
    print result

しかし、それは機能し、正しい値を返します。チュートリアルの標準のhaystackSearchView、search.htmlを使用しています

(r'^search/', include('haystack.urls')),
4

1 に答える 1

5

インデックスdocument=Trueでは、haystackが検索するドキュメントである。を使用して1つのフィールドを定義する必要があります。慣例により、このフィールドの名前はtext。値のフィルタリングまたは順序付けを行う場合は、フィールドを追加します。

検索を実行するときにいくつかのフィールドを考慮に入れる方法は、ドキュメントをテンプレートとして定義し、use_templateドキュメントフィールドに設定することです。インデックスは次のようになります。

class TDocIndex(SearchIndex):

    text = CharField(document=True, use_template=True)

    #if you plan to filter by person
    personid = IntegerField(model_attr='person__id') 

site.register(TDoc, TDocIndex)

そして、次のようなsearch / indexs/tdoc_text.txtテンプレートがあります。

{{ object.content }}
{{ object.filepath }}
{{ object.person.lastname }}

この答えを参照してください。

于 2013-04-30T21:05:56.990 に答える