我已经为我的索引(haystack)添加了一个MultivaluedField,我需要搜索ManyToMany相关字段,但它不起作用.
该引擎是WHOOSH.
这是我的索引的样子:
class PostIndex(SearchIndex):
text = CharField(document=True, use_template=True)
author = CharField(model_attr='author')
body = CharField(model_attr='body')
pub_date = DateTimeField(model_attr='publish')
regions = MultiValueField()
def prepare_regions(self, obj):
return [region.name for region in obj.regions.all()]
Run Code Online (Sandbox Code Playgroud)
这就是我的模型的样子:
class Post(models.Model):
title = models.CharField(_('title'), max_length=200)
author = models.ForeignKey(User, blank=True, null=True)
body = models.TextField(_('body'), )
allow_comments = models.BooleanField(_('allow comments'), default=True)
publish = models.DateTimeField(_('publish'), default=datetime.datetime.now)
categories = models.ManyToManyField(Category, blank=True)
tags = TagField()
objects = PublicManager()
regions = models.ManyToManyField(Region, blank=True)
Run Code Online (Sandbox Code Playgroud)
如果我使用SearchQuerySet().filter(region__in = words_list)它可以工作.问题是我不知道用户何时搜索某个区域或其他字段,因此我必须使用SearchQuerySet().filter(content__icontains = words_list).并且以这种方式找不到任何东西.
谢谢
谢谢!!
我使用Haystack 1.2.6和Whoosh 2.4以及Django 1.3.假设我们有以下模型描述了一个假设的帖子.
Post(models.Model):
title = models.CharField()
body = models.TextField()
Run Code Online (Sandbox Code Playgroud)
我们建立了这样的post索引,用于在body字段上自动完成:
PostIndex(SearchIndex):
text = CharField(document=True, use_template=True)
content_auto = indexes.EdgeNgramField(model_attr='body')
Run Code Online (Sandbox Code Playgroud)
在彻底阅读了干草堆文档后,我无法找到是否可以在标题和正文字段上进行自动完成.
所以...是可能还是......?
我需要在模型字段中搜索子字符串值.我有一个Index和一个SearchQuerySet.
这是Elasticsearch配置.
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://127.0.0.1:9200/',
'INDEX_NAME': 'haystack',
},
}
Run Code Online (Sandbox Code Playgroud)
我的索引.
class ElementIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
#model fields
title_element = indexes.EdgeNgramField(model_attr='title')
clean_content = indexes.EdgeNgramField(model_attr='clean_content')
def get_model(self):
return Element
def index_queryset(self, using=None):
"""Used when the entire index for model is updated."""
return Element.objects.filter(updatetime__lte=datetime.datetime.now())
Run Code Online (Sandbox Code Playgroud)
我的自定义搜索.
SearchQuerySet().filter(title_element=clean_value)
Run Code Online (Sandbox Code Playgroud)
在我的数据库中,我有一个值"HolaMundoTest",如果我尝试通过'Hola'或'HolaM'搜索我找到了结果,但如果我尝试'Mundo'或'mundo'或'laMun'则没有匹配.
怎么了?我不明白.
来源http://django-haystack.readthedocs.org/en/v2.1.0/autocomplete.html
我在用:
谢谢你的回答 -
我想elastic-search在我的项目中用作数据库,我在django框架上构建.据我所知,elastic search与数据库一起使用的haystack地方elastic-search仅用于索引和快速检索问题.这里阐述了如何整合数据库,并elastic-search与haystack不过,我想用elastic-search没有数据库,换句话说,我将索引的所有数据.我没有看到下面的内容,你可以elastic-search在django设置模块中用作数据库后端.
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {
'read_default_file': '/path/to/my.cnf',
},
}
Run Code Online (Sandbox Code Playgroud)
}
是不是只能elastic-search用模型层django?
这是django-elasticsearch后端,在示例部分中,它按照我想要的方式进行,但我不知道它是首先存储在数据库中还是索引elastic-search或仅存储和索引elastic-search.
我有两台Haystack服务器:
当我从Server2向Server1发出查询时,我的问题是关于分页:
但这不是最优的,如果查询返回10.000对象,查询将会很慢.
我知道你可以向查询中发送一些值的弹性搜索(大小,从和到)但我不知道这是否可以使用Haystack,我检查了文档并用Google搜索并没有发现任何内容.
SearchQuerySet()[10000:10010]它只会要求这10项?我在Haystack Docs上找到了这个:
它似乎是一个功能,做我正在尝试做的事情:
通过更改开始,结束或两个偏移来限制查询.
然后我试着做:
from haystack.query import SearchQuerySet
sqs = SearchQuerySet()
sqs.query.set_limits(low=0, high=4)
sqs.filter(content='anything')
Run Code Online (Sandbox Code Playgroud)
结果是完整列表,就像我从不添加set_limit行一样
我正在使用Whoosh和Django-Haystack.我想在用户输入错误的单词时使用查询建议.
也许你的意思是"独角兽"
是否有必要使用其他搜索引擎?或者我可以通过Whoosh成功实现这一目标吗?
我真的有干草堆的经验,但我们使用django-haystack进行搜索.目前搜索工作正常,但我刚刚将#hashtags添加到网站,我希望搜索工作以某种方式与hashtagged单词不同.
我现在拥有的:
我想要完成的事情:
希望有人能帮助我
我正在尝试用Whoosh实现Haystack。
尽管一切似乎都配置良好,但我一直收到此错误。我得到错误:
haystack.exceptions.SearchBackendError: No fields were found in any search_indexes. Please correct this before attempting to search.
Run Code Online (Sandbox Code Playgroud)
...当我尝试做时。/manage.pyrebuild_index
组态:
HAYSTACK_SITECONF = 'myproject'
HAYSTACK_SEARCH_ENGINE = 'whoosh'
HAYSTACK_WHOOSH_PATH = cwd + '/whoosh/mysite_index'
Run Code Online (Sandbox Code Playgroud)
在我的项目的根文件夹中成功创建了whoosh / mysite_index目录。
* search_sites.py *
import haystack
haystack.autodiscover()
Run Code Online (Sandbox Code Playgroud)
* search_indexes.py *
from haystack.indexes import *
from haystack import site
from myproject.models import *
class ResearchersIndex(SearchIndex):
text = CharField(document=True, use_template=True)
name = CharFIeld(model_attr='name')
class SubjectIndex(SearchIndex):
short_name = CharField(model_attr='short_name')
name = CharField(model_attr='name')
text = CharField(document=True, use_template=True)
class ResearchIndex(SearchIndex): …Run Code Online (Sandbox Code Playgroud) 我有一段时间试图在单词的开头或中间处理撇号字符.我能够处理占有欲的英语,但我也试图迎合法语并处理像"动作"这样的词,其中撇号字符出现在单词的开头而不是像"她的"那样.
通过haystack auto_query搜索"d action"将返回结果,但"d'action"不返回任何内容.如果我直接查询elasticsearch _search API(_search?q = D%27ACTION),我会得到"d'action"的结果.因此,我想知道这是否是干草堆引擎问题.
我的配置:
'settings': {
"analysis": {
"char_filter": {
"quotes": {
"type": "mapping",
"mappings": [
"\\u0091=>\\u0027",
"\\u0092=>\\u0027",
"\\u2018=>\\u0027",
"\\u2019=>\\u0027",
"\\u201B=>\\u0027"
]
}
},
"analyzer": {
"ch_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": ['ch_en_possessive_word_delimiter', 'ch_fr_stemmer'],
"char_filter": ['html_strip', 'quotes'],
},
},
"filter": {
"ch_fr_stemmer" : {
"type": "snowball",
"language": "French"
},
"ch_en_possessive_word_delimiter": {
"type": "word_delimiter",
"stem_english_possessive": True
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还有ElasticsearchSearchBackend和BaseEngine的子类,所以我可以添加上面的配置:
class ConfigurableESBackend(ElasticsearchSearchBackend):
# Word reserved by Elasticsearch for special use.
RESERVED_WORDS = (
'AND', …Run Code Online (Sandbox Code Playgroud) 我按照教程:http : //krzysztofzuraw.com/blog/2016/haystack-elasticsearch-part-two.html http://www.techstricks.com/django-haystack-and-elasticsearch-tutorial/
一切正常但是当我尝试从搜索框中查询某些内容时,它显示没有找到结果,并且在控制台中出现此错误.
INFO base GET http://127.0.0.1:9200/haystack/_mapping [status:200 request:0.015s]
INFO base PUT http://127.0.0.1:9200/haystack [status:400 request:0.018s]
INFO base PUT http://127.0.0.1:9200/haystack/_mapping/modelresult [status:200 request:0.023s]
WARNING base GET http://127.0.0.1:9200/haystack/modelresult/_search?_source=true [status:400 request:0.005s]
Failed to query Elasticsearch using '(a)': TransportError(400, 'parsing_exception', 'no [query] registered for [filtered]')
Traceback (most recent call last):
File "/home/alamin/.virtualenvs/msnb2/lib/python3.5/site-packages/haystack/backends/elasticsearch_backend.py", line 524, in search
_source=True)
File "/home/alamin/.virtualenvs/msnb2/lib/python3.5/site-packages/elasticsearch/client/utils.py", line 71, in _wrapped
return func(*args, params=params, **kwargs)
File "/home/alamin/.virtualenvs/msnb2/lib/python3.5/site-packages/elasticsearch/client/__init__.py", line 569, in search
doc_type, '_search'), params=params, body=body)
File "/home/alamin/.virtualenvs/msnb2/lib/python3.5/site-packages/elasticsearch/transport.py", line 327, in …Run Code Online (Sandbox Code Playgroud) django-haystack ×10
django ×9
python ×4
whoosh ×3
hashtag ×1
multivalue ×1
pagination ×1
search ×1
solr ×1