152. Elasticsearch의suggest 연상 알림 조회 실현

2236 단어 Elasticsearch

Elasticsearch의 suggest 연상 알림 조회 구현


생각

  • 먼저 키워드를completions 자동 완성 인덱스 라이브러리에서 조회하여 제안된 완성 정보를 얻습니다
  • 만약에 보완 정보를 얻지 못하면 사용자가 입력한 키워드에 맞춤법 오류가 있음을 나타낼 수 있으며,articles 인덱스 라이브러리에서 오류 수정 건의 조회를 합니다

  • 실현


    toutiao-backend/toutiao/resources/search.py에서 자동 보기 보완 실현
    class SuggestionResource(Resource):
        """
         
        """
        def get(self):
            """
             
            """
            qs_parser = RequestParser()
            qs_parser.add_argument('q', type=inputs.regex(r'^.{1,50}$'), required=True, location='args')
            args = qs_parser.parse_args()
            q = args.q
    
            #  
            query = {
                'from': 0,
                'size': 10,
                '_source': False,
                'suggest': {
                    'word-completion': {
                        'prefix': q,
                        'completion': {
                            'field': 'suggest'
                        }
                    }
                }
            }
            ret = current_app.es.search(index='completions', body=query)
            options = ret['suggest']['word-completion'][0]['options']
    
            #  , 
            if not options:
                query = {
                    'from': 0,
                    'size': 10,
                    '_source': False,
                    'suggest': {
                        'text': q,
                        'word-phrase': {
                            'phrase': {
                                'field': '_all',
                                'size': 1
                            }
                        }
                    }
                }
                ret = current_app.es.search(index='articles', doc_type='article', body=query)
                options = ret['suggest']['word-phrase'][0]['options']
    
            results = []
            for option in options:
                if option['text'] not in results:
                    results.append(option['text'])
    
            return {'options': results}

    좋은 웹페이지 즐겨찾기