ElasticSearch和Python - 正确的方法论

时间:2014-01-29 09:30:06

标签: python search full-text-search elasticsearch full-text-indexing

我正在为我的文章列表构建搜索引擎。很多人建议我使用弹性搜索进行全文搜索。我写了以下代码。有用。但我有一些问题。

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

1 个答案:

答案 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

的文档