-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #4211 from safwanrahman/search
Upgrade Elasticsearch to version 6.x
- Loading branch information
Showing
29 changed files
with
436 additions
and
167 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
from django.db import models | ||
|
||
|
||
class HTMLFileManager(models.Manager): | ||
|
||
def get_queryset(self): | ||
return super(HTMLFileManager, self).get_queryset().filter(name__endswith='.html') |
54 changes: 54 additions & 0 deletions
54
readthedocs/projects/migrations/0026_add_htmlfile_model.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
# -*- coding: utf-8 -*- | ||
# Generated by Django 1.9.13 on 2018-06-18 16:45 | ||
from __future__ import unicode_literals | ||
|
||
from django.db import migrations, models | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
dependencies = [ | ||
('projects', '0025_show-version-warning-existing-projects'), | ||
] | ||
|
||
operations = [ | ||
migrations.CreateModel( | ||
name='HTMLFile', | ||
fields=[ | ||
], | ||
options={ | ||
'proxy': True, | ||
}, | ||
bases=('projects.importedfile',), | ||
), | ||
migrations.AlterField( | ||
model_name='project', | ||
name='comment_moderation', | ||
field=models.BooleanField(default=False, verbose_name='Comment Moderation'), | ||
), | ||
migrations.AlterField( | ||
model_name='project', | ||
name='documentation_type', | ||
field=models.CharField(choices=[('auto', 'Automatically Choose'), ('sphinx', 'Sphinx Html'), ('mkdocs', 'Mkdocs (Markdown)'), ('sphinx_htmldir', 'Sphinx HtmlDir'), ('sphinx_singlehtml', 'Sphinx Single Page HTML')], default='sphinx', help_text='Type of documentation you are building. <a href="http://www.sphinx-doc.org/en/stable/builders.html#sphinx.builders.html.DirectoryHTMLBuilder">More info</a>.', max_length=20, verbose_name='Documentation type'), | ||
), | ||
migrations.AlterField( | ||
model_name='project', | ||
name='language', | ||
field=models.CharField(choices=[('aa', 'Afar'), ('ab', 'Abkhaz'), ('af', 'Afrikaans'), ('am', 'Amharic'), ('ar', 'Arabic'), ('as', 'Assamese'), ('ay', 'Aymara'), ('az', 'Azerbaijani'), ('ba', 'Bashkir'), ('be', 'Belarusian'), ('bg', 'Bulgarian'), ('bh', 'Bihari'), ('bi', 'Bislama'), ('bn', 'Bengali'), ('bo', 'Tibetan'), ('br', 'Breton'), ('ca', 'Catalan'), ('co', 'Corsican'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dz', 'Dzongkha'), ('el', 'Greek'), ('en', 'English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Iranian'), ('fi', 'Finnish'), ('fj', 'Fijian'), ('fo', 'Faroese'), ('fr', 'French'), ('fy', 'Western Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('gn', 'Guarani'), ('gu', 'Gujarati'), ('ha', 'Hausa'), ('hi', 'Hindi'), ('he', 'Hebrew'), ('hr', 'Croatian'), ('hu', 'Hungarian'), ('hy', 'Armenian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('ie', 'Interlingue'), ('ik', 'Inupiaq'), ('is', 'Icelandic'), ('it', 'Italian'), ('iu', 'Inuktitut'), ('ja', 'Japanese'), ('jv', 'Javanese'), ('ka', 'Georgian'), ('kk', 'Kazakh'), ('kl', 'Kalaallisut'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('ks', 'Kashmiri'), ('ku', 'Kurdish'), ('ky', 'Kyrgyz'), ('la', 'Latin'), ('ln', 'Lingala'), ('lo', 'Lao'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mg', 'Malagasy'), ('mi', 'Maori'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('ms', 'Malay'), ('mt', 'Maltese'), ('my', 'Burmese'), ('na', 'Nauru'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('no', 'Norwegian'), ('oc', 'Occitan'), ('om', 'Oromo'), ('or', 'Oriya'), ('pa', 'Panjabi'), ('pl', 'Polish'), ('ps', 'Pashto'), ('pt', 'Portuguese'), ('qu', 'Quechua'), ('rm', 'Romansh'), ('rn', 'Kirundi'), ('ro', 'Romanian'), ('ru', 'Russian'), ('rw', 'Kinyarwanda'), ('sa', 'Sanskrit'), ('sd', 'Sindhi'), ('sg', 'Sango'), ('si', 'Sinhala'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sm', 'Samoan'), ('sn', 'Shona'), ('so', 'Somali'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('ss', 'Swati'), ('st', 'Southern Sotho'), ('su', 'Sudanese'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('tg', 'Tajik'), ('th', 'Thai'), ('ti', 'Tigrinya'), ('tk', 'Turkmen'), ('tl', 'Tagalog'), ('tn', 'Tswana'), ('to', 'Tonga'), ('tr', 'Turkish'), ('ts', 'Tsonga'), ('tt', 'Tatar'), ('tw', 'Twi'), ('ug', 'Uyghur'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('uz', 'Uzbek'), ('vi', 'Vietnamese'), ('vo', 'Volapuk'), ('wo', 'Wolof'), ('xh', 'Xhosa'), ('yi', 'Yiddish'), ('yo', 'Yoruba'), ('za', 'Zhuang'), ('zh', 'Chinese'), ('zu', 'Zulu'), ('nb_NO', 'Norwegian Bokmal'), ('pt_BR', 'Brazilian Portuguese'), ('es_MX', 'Mexican Spanish'), ('uk_UA', 'Ukrainian'), ('zh_CN', 'Simplified Chinese'), ('zh_TW', 'Traditional Chinese')], default='en', help_text="The language the project documentation is rendered in. Note: this affects your project's URL.", max_length=20, verbose_name='Language'), | ||
), | ||
migrations.AlterField( | ||
model_name='project', | ||
name='privacy_level', | ||
field=models.CharField(choices=[('public', 'Public'), ('protected', 'Protected'), ('private', 'Private')], default='public', help_text='Level of privacy that you want on the repository. Protected means public but not in listings.', max_length=20, verbose_name='Privacy Level'), | ||
), | ||
migrations.AlterField( | ||
model_name='project', | ||
name='python_interpreter', | ||
field=models.CharField(choices=[('python', 'CPython 2.x'), ('python3', 'CPython 3.x')], default='python', help_text='The Python interpreter used to create the virtual environment.', max_length=20, verbose_name='Python Interpreter'), | ||
), | ||
migrations.AlterField( | ||
model_name='project', | ||
name='version_privacy_level', | ||
field=models.CharField(choices=[('public', 'Public'), ('protected', 'Protected'), ('private', 'Private')], default='public', help_text='Default level of privacy you want on built versions of documentation.', max_length=20, verbose_name='Version Privacy Level'), | ||
), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
SEARCH_EXCLUDED_FILE = ['search.html', 'genindex.html', 'py-modindex.html'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
from django.conf import settings | ||
from django_elasticsearch_dsl import DocType, Index, fields | ||
|
||
from readthedocs.projects.models import Project, HTMLFile | ||
from .conf import SEARCH_EXCLUDED_FILE | ||
|
||
from readthedocs.search.faceted_search import ProjectSearch, FileSearch | ||
|
||
project_conf = settings.ES_INDEXES['project'] | ||
project_index = Index(project_conf['name']) | ||
project_index.settings(**project_conf['settings']) | ||
|
||
page_conf = settings.ES_INDEXES['page'] | ||
page_index = Index(page_conf['name']) | ||
page_index.settings(**page_conf['settings']) | ||
|
||
|
||
@project_index.doc_type | ||
class ProjectDocument(DocType): | ||
|
||
class Meta(object): | ||
model = Project | ||
fields = ('name', 'slug', 'description') | ||
|
||
url = fields.TextField(attr='get_absolute_url') | ||
users = fields.NestedField(properties={ | ||
'username': fields.TextField(), | ||
'id': fields.IntegerField(), | ||
}) | ||
language = fields.KeywordField() | ||
|
||
@classmethod | ||
def faceted_search(cls, query, language=None, using=None, index=None): | ||
kwargs = { | ||
'using': using or cls._doc_type.using, | ||
'index': index or cls._doc_type.index, | ||
'doc_types': [cls], | ||
'model': cls._doc_type.model, | ||
'query': query | ||
} | ||
|
||
if language: | ||
kwargs['filters'] = {'language': language} | ||
|
||
return ProjectSearch(**kwargs) | ||
|
||
|
||
@page_index.doc_type | ||
class PageDocument(DocType): | ||
|
||
class Meta(object): | ||
model = HTMLFile | ||
fields = ('commit',) | ||
|
||
project = fields.KeywordField(attr='project.slug') | ||
version = fields.KeywordField(attr='version.slug') | ||
|
||
title = fields.TextField(attr='processed_json.title') | ||
headers = fields.TextField(attr='processed_json.headers') | ||
content = fields.TextField(attr='processed_json.content') | ||
path = fields.TextField(attr='processed_json.path') | ||
|
||
@classmethod | ||
def faceted_search(cls, query, projects_list=None, versions_list=None, using=None, index=None): | ||
kwargs = { | ||
'using': using or cls._doc_type.using, | ||
'index': index or cls._doc_type.index, | ||
'doc_types': [cls], | ||
'model': cls._doc_type.model, | ||
'query': query | ||
} | ||
filters = {} | ||
|
||
if projects_list: | ||
filters['project'] = projects_list | ||
if versions_list: | ||
filters['version'] = versions_list | ||
|
||
kwargs['filters'] = filters | ||
|
||
return FileSearch(**kwargs) | ||
|
||
def get_queryset(self): | ||
"""Overwrite default queryset to filter certain files to index""" | ||
queryset = super(PageDocument, self).get_queryset() | ||
|
||
# Do not index files that belong to non sphinx project | ||
# Also do not index certain files | ||
queryset = (queryset.filter(project__documentation_type='sphinx') | ||
.exclude(name__in=SEARCH_EXCLUDED_FILE)) | ||
return queryset | ||
|
||
def update(self, thing, refresh=None, action='index', **kwargs): | ||
"""Overwrite in order to index only certain files""" | ||
# Object not exist in the provided queryset should not be indexed | ||
# TODO: remove this overwrite when the issue has been fixed | ||
# See below link for more information | ||
# https://github.com/sabricot/django-elasticsearch-dsl/issues/111 | ||
if isinstance(thing, HTMLFile): | ||
# Its a model instance. | ||
queryset = self.get_queryset() | ||
obj = queryset.filter(pk=thing.pk) | ||
if not obj.exists(): | ||
return None | ||
|
||
return super(PageDocument, self).update(thing=thing, refresh=None, action='index', **kwargs) |
Oops, something went wrong.