欧洲的许多语言都是屈折变化的。这意味着一个词可以在文本中以多种形式书写。例如,波兰语“komputer”中的“computer”一词有多种形式:“komputera”、“komputerowi”、“komputerem”、“komputery”等。
我应该如何正确使用 django+haystack+whoosh 来处理语言屈折?
每当我搜索任何形式的“komputer”、“komputera”、“komputerowi”时,我的意思都是一样的 ->“komputer”。
在 NLP 中,有一种基于词干(切割后缀)或将形式转换为基本形式(“komputerowi”=>“komputer”)的基本方法。有一些库可以帮助解决这个问题。
我的第一个想法是准备一些特殊的模板过滤器,将给定变量中的每个识别的单词转换为具有基本形式而不是形式的文本。然后我可以在 django+haystack 的搜索索引模板中使用它。如果在 whoosh 引擎中评估之前搜索查询也将被转换,这应该很好用。见示例:
haystack search index template:
{{some_indexed_text|convert_to_base_form_filter}}
text to index: "Nie ma komputera" => "Nie ma komputer" <- this is really indexed
search query: "komputery" => "komputer" <-- this will match
Run Code Online (Sandbox Code Playgroud)
但我不认为这是这个问题的“优雅”解决方案,其他一些功能也不起作用 - 比如建议拼写错误的建议。
那么 - 我应该如何解决这个问题?也许我应该使用其他搜索引擎而不是 whoosh?
我一直在与django-haystack有一些问题,需要一些帮助.
我运行一个网站,指标项目,某些项目是在状态,他们不应该被看到的,即status='DE',status='PR'
我目前的设置是.
from haystack.indexes import *
from haystack import site
from models import Project
class ProjectIndex(RealTimeSearchIndex):
project_name = CharField(document=True, use_template=True)
description = CharField(use_template=True, model_attr='description')
location = CharField(use_template=True, model_attr='location')
owner = CharField(model_attr='owner')
def search(self):
return Project.objects.filter(status='AP').exclude(status='PR').exclude(status='DE')
def index_queryset(self):
"""Used when the entire index for model is updated."""
return Project.objects.filter(status='AP').exclude(status='PR').exclude(status='DE')
def get_queryset(self):
"""Used when the entire index for model is updated."""
return Project.objects.filter(status='AP').exclude(status='PR').exclude(status='DE')
def read_queryset(self):
"""Used when the entire index for model is updated."""
return Project.objects.filter(status='AP').exclude(status='PR').exclude(status='DE')
site.register(Project, ProjectIndex)
Run Code Online (Sandbox Code Playgroud) 使用Django Haystack设置搜索页面需要输入他们的URLconf片段url(r'^search/', include('haystack.urls')).但是,这意味着(至少从我对Django/MVC的基本理解),没有简单的方法来传递额外的上下文(即额外的字典键/值)来呈现到页面上.
特别是,我想自定义一个搜索字段来镜像从GET请求传递到页面的变量:
<form method="get" action=".">
<input type="text" name="q" value="">
<!-- result html here -->
</form>
Run Code Online (Sandbox Code Playgroud)
假设参数?q=twitter作为GET请求的一部分附加到URL; 我想让value选择器等于twitter.如果我控制了视图,我可能会这样做:
if request.method == 'GET':
q = request.GET['q']
return render(request, 'template.html', {'q': q})
Run Code Online (Sandbox Code Playgroud)
然后将其q用作valueHTML中选择器的值<input>.
除了编辑Haystack源之外,有没有办法以简单的方式完成这个任务?
我有两个django过滤器,我想用来过滤掉帖子,但是一个帖子可以有很多类别,所以我把类别放在URL的列表中.现在问题出现了 - 我需要按帖子的标题和类别进行筛选,但我需要以一种方式进行筛选,这样我就可以检查类别的联合.这是当前的代码:
sqs = SearchQuerySet().all()
if 'title' in request.GET and request.GET['title'] != '':
sqs = sqs.filter_and(title=request.GET['title'])
if 'category' in request.GET and request.GET['category'] != '':
catlist = request.GET.getlist('category')
for i in catlist:
sqs = sqs.filter_or(category=i)
Run Code Online (Sandbox Code Playgroud)
非常感谢你的帮助!
更多信息:Django 1.4.1,Django-Haystack 1.2.7
编辑:
我做了你的建议(使用__in):
if 'title' in request.GET and request.GET['title'] != '':
sqs = sqs.filter_and(title=request.GET['title'])
if 'category' in request.GET and request.GET['category'] != '':
catlist = request.GET.getlist('category')
sqs = sqs.filter_or(category__in=catlist)
Run Code Online (Sandbox Code Playgroud)
但仍然没有运气 - 我不能按字段和类别搜索.仅按类别搜索似乎有效,但当这两个字段一起输入时,它们不起作用.
我正在使用django haystack 1.27.我可以搜索.那很棒.但我如何搜索部分单词?
例如:
搜索后:OREM,OR,EM
词:LOREM
结果:LOREM
search_indexes.py
class NewsIndex(SearchIndex):
text = CharField(document=True, use_template=True)
date = DateTimeField(model_attr='creation_date')
def get_model(self):
return News
def index_queryset(self):
return self.get_model().objects.get_published_models(TOWN, News)
site.register(News, NewsIndex)
Run Code Online (Sandbox Code Playgroud)
views.py
def search(request):
order = self.request.GET.get("order", None)
sqs = SearchQuerySet()
if order:
...
sqs = sqs.order_by(order + "date")
search_template = SearchView(template='general/search.html',
searchqueryset=sqs)(request)
Run Code Online (Sandbox Code Playgroud)
订购并不困难.
我认为搜索索引引擎包括部分搜索:/.Whoosh是否支持此功能?我测试过:自动完成功能,但没有"EM"的结果,只是"LOR".
我正在使用 Django Haystack进行搜索。
我只想title在搜索结果时定位模型的领域。
但目前,如果搜索词位于我的模型中的任何字段中,它就会返回结果。
例如:搜索xyz会给出xyz位于字段中的结果bio。
这不应该发生,我只想返回xyz位于title字段中的结果。Artist.title完全忽略除搜索之外的所有其他字段。
artists/models.py:
class Artist(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField(max_length=100)
strapline = models.CharField(max_length=255)
image = models.ImageField(upload_to=get_file_path, storage=s3, max_length=500)
bio = models.TextField()
Run Code Online (Sandbox Code Playgroud)
artists/search_indexes.py
from haystack import indexes
from app.artists.models import Artist
class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True, model_attr='title')
def get_model(self):
return Artist
Run Code Online (Sandbox Code Playgroud)
我想把它想象成一个 SQL 查询:
SELECT * FROM artists WHERE title LIKE '%{search_term}%'
Run Code Online (Sandbox Code Playgroud)
更新
按照删除 use_template=True 的建议,我的 search_indexes.py …
我在Django上创建我的博客,我想基于django-haystack添加网站搜索.我使用官方手册制作了干草堆的基本配置,但是当我想测试我的搜索时,我收到一个错误:'选项'对象没有属性'_fields'
以下是我的一些配置:
search_indexes.pyclass PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
title = indexes.CharField(model_attr='title')
pub_date = indexes.DateTimeField(model_attr='date')
def get_model(self):
return Post
def index_queryset(self, using=None):
"""Used when the entire index for model is updated."""
return self.get_model().objects.all()
Run Code Online (Sandbox Code Playgroud)
settings.py
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.simple_backend.SimpleEngine',
},
}
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
Run Code Online (Sandbox Code Playgroud)
所以这是我的问题.有没有人与smth相似?提前致谢!
(更新:问题特定于自动查询的使用)
据我从文档以及从源代码可以看出,该HAYSTACK_DEFAULT_OPERATOR设置应控制.filter(...)在查询集上链接子句时如何组合子句。
但是当我AutoQuery额外使用时,似乎正在控制所有单词是否匹配,或者短语中的任何单词都匹配。(我正在使用ElasticSearch)
例如:
HAYSTACK_DEFAULT_OPERATOR = 'OR'
sqs = SearchQuerySet().filter(content=AutoQuery('some of these words are in my content'))
sqs.count() = 53
HAYSTACK_DEFAULT_OPERATOR = 'AND'
sqs = SearchQuerySet().filter(content=AutoQuery('some of these words are in my content'))
sqs.count() = 0
sqs = SearchQuerySet().filter(content=AutoQuery('all these words are in the content'))
sqs.count() = 1
Run Code Online (Sandbox Code Playgroud)
奇怪的是,使用filter_or或filter_and似乎没有任何区别。例如
HAYSTACK_DEFAULT_OPERATOR = 'AND'
sqs = SearchQuerySet().filter_or(content=AutoQuery('some of these words are in my content'))
sqs.count() = 0
Run Code Online (Sandbox Code Playgroud)
答案必须在干草堆源代码中的某个地方,我将继续寻找,至少在文档中这似乎是一个缺陷。 …
我正在使用haystack(2.1.1)并在我的django(1.7)网站上嗖的一声.我很高兴因为它有效但不完全.该应用程序显示正确的搜索,但当我点击结果时,它不会转到产品页面.看起来我没有配置使{{result.object.get_absolute_url}}无法正常工作的东西.我希望你们中的任何人都可以帮助我(作为参考,我把所有代码都放在一边)
这是我的应用型号(产品/型号)
from django.db import models
class Products(models.Model):
name = models.CharField(max_length=120)
description = models.TextField()
image1 = models.ImageField(upload_to='product_images', blank=True, null=True)
price = models.FloatField(default=0.00)
slug = models.CharField(max_length=50, blank=False, null=True)
pub_date = models.DateTimeField()
def __unicode__(self):
return str(self.name)
class Meta:
ordering =['-id']
verbose_name = ('Product')
verbose_name_plural = ('Products')
Run Code Online (Sandbox Code Playgroud)
这是我的search_indexes.py,我把它放在我的应用程序的同一个文件夹中(products/search_indexes.py)
import datetime
from haystack import indexes
from products.models import Products
class ProductsIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
name = indexes.CharField(model_attr='name')
description = indexes.CharField(model_attr='description')
pub_date = indexes.DateTimeField(model_attr='pub_date')
def get_model(self):
return Products
def index_queryset(self, using=None):
return self.get_model().objects.filter(pub_date__lte=datetime.datetime.now()) …Run Code Online (Sandbox Code Playgroud) 我想在我的 django 应用程序中包含全文搜索。我为此使用 whoosh-haystack。当我在已安装的应用程序中包含 whoosh 和 haystack 并执行命令./manage.py时,出现导入错误。任何人都可以解决这个问题。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'whoosh',
'haystack',
'galleryApp',
'galleryAdmin',
]
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 327, in execute
django.setup()
File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 18, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 115, in populate
app_config.ready()
File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/apps.py", line 22, in ready
self.module.autodiscover()
File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/__init__.py", line 26, in autodiscover
autodiscover_modules('admin', register_to=site) …Run Code Online (Sandbox Code Playgroud) django-haystack ×10
django ×9
whoosh ×3
python ×2
django-forms ×1
get ×1
inflection ×1
python-2.7 ×1
search ×1