我正在为我的文章列表构建搜索引擎。很多人建议我使用弹性搜索进行全文搜索。我写了以下代码。有用。但我有一些问题。
1)如果同一篇文章被添加两次 - 即indexdoc对同一篇文章运行两次,它会接受它并将文章添加两次。有没有办法拥有一个"独特的键"在搜索索引中。
2)如何更改评分/排名功能?我想更加重视头衔?
3)这是正确的方法吗?
4)如果出现拼写错误,如何显示相关结果?
from elasticsearch import Elasticsearch
from crsq.models import ArticleInfo
es = Elasticsearch()
def indexdoc(articledict):
doc = {
'text': articledict['articlecontent'],
'title' : articledict['articletitle'],
'url': articledict['url']
}
res = es.index(index="article-index", doc_type='article', body=doc)
def searchdoc(keywordstr):
res = es.search(index="article-index", body={"query": {"query_string": {"query": keywordstr}}})
print("Got %d Hits:" % res['hits']['total'])
for hit in res['hits']['hits']:
print("%(url)s: %(text)s" % hit["_source"])
def indexurl(url):
articledict = ArticleInfo.objects.filter(url=url).values()
if len(articledict):
indexdoc(articledict)
return
答案 0 :(得分:1)
1)您必须为您的文档指定ID。在索引时必须添加参数id
res = es.index(index="article-index", doc_type='article', body=doc, id="some_unique_id")
2)有多种方法可以做到这一点,但是例如你可以通过改变你的查询来提升标题:
{"query": {"query_string": {"query": keywordstr, "fields" : ["text", "title^2"]}}
通过此更改title
将具有字段text
3)作为一个概念证明并不坏。
4)这是一个很大的话题,我认为你应该查看suggesters
的文档