2013-02-21 2 views
1

Джанго Стог docs say:Основное название поля (документ = True)

**Warning** 
When you choose a document=True field, it should be consistently named across all of your SearchIndex classes to avoid confusing the backend. The convention is to name this field text. 

There is nothing special about the text field name used in all of the examples. It could be anything; you could call it pink_polka_dot and it won’t matter. It’s simply a convention to call it text. 

Но я не понимаю, что это значит. Это их пример модель:

импорт DateTime из Стога импорта индексов из myapp.models импорта Примечания

class NoteIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    author = indexes.CharField(model_attr='user') 
    pub_date = indexes.DateTimeField(model_attr='pub_date') 

    def get_model(self): 
     return Note 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.filter(pub_date__lte=datetime.datetime.now()) 

текст, который я цитировал ссылаясь на мою модели основного поле и сказать, что я должен назвать это «текст "или к классу, определенному в search_indexes.py?

Если класс в search_indexes.py, где имя поля, к которому он присоединен в примере выше? У него нет model_attr!

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

А если мои фактические модели приложения, как я ожидал, чтобы реорганизовать проект с большим количеством многих приложений, чтобы назвать их основное текстовое поле «текст»!

Просьба сообщить. Благодарю.

ответ

7

Ваше определение SearchIndex не должно отражать вашу модель, вам необходимо сопоставить данные из разных моделей с общим поисковым документом.

  1. Почему текстовое поле должно называться последовательно?
  2. Как выглядит контент для карты? (Почему там нет model_attr ключевых слов)

стога документация советует, что ваш SearchIndex поле должно быть названы последовательно через ваши SearchIndex определений - не то, что ваши модели поле должно быть названо последовательно. Существует большое различие между определениями индекса поиска и определениями моделей. Вам не нужно и, вероятно, не стоит беспокоиться о сопоставлении 1-1 между полями модели и полями поиска.

Шаг назад от ваших моделей и сначала подумайте о том, что вы хотите найти. Будете ли вы искать несколько разных моделей с помощью общего вида поиска? Допустим, ваши две модели:

class Note(models.Model): 
    title = models.CharField(max_length=40) 
    body = models.TextField() 

class Memo(models.Model): 
    subject = models.CharField(max_length=50) 
    content = models.TextField() 
    author = models.ForeignKey(StaffMember) 

Мы хотим создать простой вид поиска, который выполняет поиск только основной контент модели, а также название или имя объекта контента (имя, название, предмет, и т.д. .).

Вот плохой пример (не делайте этого):

class NoteIndex(indexes.SearchIndex, indexes.Indexable): 
    body = indexes.CharField(document=True, use_template=True) 
    title = indexes.CharField(model_attr='title') 

    def get_model(self): 
     return Note 

class MemoIndex(indexes.SearchIndex, indexes.Indexable): 
    content = indexes.CharField(document=True, use_template=True) 
    subject = indexes.CharField(model_attr='subject') 

    def get_model(self): 
     return Memo 

В этом плохой пример, каждый поисковый индекс ли определить первичный контент поле и поле имени контента (название или предмет) , Но как вы его сейчас ищете? Если вы запустите запрос на контент на основе subject, вы пропустите контент Note, и аналогичным образом, если вы запросите запрос на body.

Лучше пример (это сделать):

class NoteIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    title = indexes.CharField(model_attr='title') 

    def get_model(self): 
     return Note 

class MemoIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    title = indexes.CharField(model_attr='subject') 

    def get_model(self): 
     return Memo 

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

Поиск документов в поисковой системе, а не строк в базе данных, поэтому определение SeachIndex отображает содержимое из базы данных (одна таблица или запрос по многим) в поисковый документ. Определение SearchIndex - это преобразование, и каждый SearchField преобразует данные по вашему усмотрению.

Что касается вашего вопроса о недостающем model_attr, это всего лишь один из способов привлечь контент. Вы также можете отображать текстовое содержимое из шаблона, что делает поле text (см. SearchField API documentation на этом). Источник model_attr хорошо работает для простых полей символов.

Смежные вопросы