#検索サーバー用
import csv
import warnings
warnings.filterwarnings("ignore")
import time
import re
from flask import Flask, render_template, request, g
app = Flask(__name__)
from elasticsearch import Elasticsearch
from operator import itemgetter
counter = 1
import json

@app.route('/')
def form():
    return render_template('form.html')

@app.route('/search')
def search():
    es = Elasticsearch(host = '153.120.18.55', port = 9200, http_auth = ('elastic', 'DiaWYfh0mxo1Sn498D6A'))
    query_r = request.args.get('query')
    query_r = query_r.lower()
    mode_r = request.args.get('mode_flag')

    if mode_r == 'primary':
        #ラベル検索start
        t1 = time.time()
        hash_r = request.args.get('hash')
        hash_r = hash_r.lower()
        hash_len = len(hash_r)
        search_r = request.args.get('button')
        label = []
        if search_r == 'keyword':
            title_list = []
            text_list = []
            publisher_list = []
            label_list = []
            ID_list = []
            if hash_len >= 1:
                f_res = es.search(index = 'sample00', query = {'prefix':{'Text': hash_r }},
                _source = ['Label', 'Title','Text','Publisher', 'ID'], size = 20)
                for doc in f_res['hits']['hits']:
                    dict1 = doc['_source']
                    label_list.append(dict1['Label'])
                    title_list.append(dict1['Title'])
                    text_list.append(dict1['Text'])
                    publisher_list.append(dict1['Publisher'])
                    ID_list.append(dict1['ID'])
            else:        
                f_res = es.search(index = 'sample00', body = {
                    '_source':['Label', 'Title','Text','Publisher', 'ID'],
                    'size':20,
                    'query':{
                        'bool':{
                            'should':[
                                {"match":{"Label": query_r }},
                                {"match":{"Title": query_r }},
                                {"match":{"Text": query_r }},
                                {"match":{"Publisher": query_r }},
                                {"match_phrase":{"Title": query_r }},
                                {"match_phrase":{"Text": query_r }},
                                {"match_phrase_prefix": {"Text": query_r }}
                            ]
                    }}})
                for doc in f_res['hits']['hits']:
                    dict1 = doc['_source']
                    label_list.append(dict1['Label'])
                    title_list.append(dict1['Title'])
                    text_list.append(dict1['Text'])
                    publisher_list.append(dict1['Publisher'])
                    ID_list.append(dict1['ID'])
            hit = []
            for i in range(len(title_list)):
                hit.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'label': label_list[i]})
            del hit[0]
            return render_template("search_keyword.html", hit = hit) 
                
        else:
            if hash_len >= 1:
                f_res = es.search(index = 'sample00', body = {
                    '_source':['Label', 'Title','Text','Publisher', 'ID', 'Vector'],
                    'size':1,
                    'query':{'prefix':{'Text': hash_r }}})
                for doc in f_res['hits']['hits']:
                    dict1 = doc['_source']
                    label = dict1['Label']
                    t_label = dict1['Label']
                    t_title = dict1['Title']
                    t_text = dict1['Text']
                    t_publisher = dict1['Publisher']
                    t_id = dict1['ID']
                    t_vec = dict1['Vector']
            else:
                f_res = es.search(index = 'sample00', body = {
                    '_source':['Label', 'Title','Text','Publisher', 'ID', 'Vector'],
                    'size':1,
                    'query':{
                        'bool':{
                            'should':[
                                {"match":{"Label": query_r }},
                                {"match":{"Title": query_r }},
                                {"match":{"Text": query_r }},
                                {"match":{"Publisher": query_r }},
                                {"match_phrase":{"Title": query_r }},
                                {"match_phrase":{"Text": query_r }},
                                {"match_phrase_prefix": {"Text": query_r }}
                            ]
                    }}})
                for doc in f_res['hits']['hits']:
                    dict1 = doc['_source']
                    label = dict1['Label']
                    t_label = dict1['Label']
                    t_title = dict1['Title']
                    t_text = dict1['Text']
                    t_publisher = dict1['Publisher']
                    t_id = dict1['ID']
                    t_vec = dict1['Vector']
            if len(label) >= 1:
                label_list_ = label.split(',')
                num = 0
                label_list = []
                
                for l in label_list_:
                    label_list.append(l)
                    num += 1
                    if num == 15:
                        break

                label = ', '.join(label_list)
                res = es.search(index = 'sample00', body = {
                    '_source':['Label', 'Title', 'Text','Publisher', 'ID'],
                    'size': 51,
                    "query": {
                        "function_score": {
                        "query": {
                            "bool": {
                            "should": [
                                {"match_phrase": {"Label": label_list[0]}},
                                {"match_phrase": {"Label": label_list[1]}},
                                {"match_phrase": {"Label": label_list[2]}},
                                {"match_phrase": {"Label": label_list[3]}},
                                {"match_phrase": {"Label": label_list[4]}},
                                {"match_phrase": {"Label": label_list[5]}},
                                {"match_phrase": {"Label": label_list[6]}},
                                {"match_phrase": {"Label": label_list[7]}},
                                {"match_phrase": {"Label": label_list[8]}},
                                {"match_phrase": {"Label": label_list[9]}},
                                {"match_phrase": {"Label": label_list[10]}},
                                {"match_phrase": {"Label": label_list[11]}},
                                {"match_phrase": {"Label": label_list[12]}},
                                {"match_phrase": {"Label": label_list[13]}},
                                {"match_phrase": {"Label": label_list[14]}},
                            ],
                            "minimum_should_match": 14
                            }
                        },
                        "functions": [
                            {
                            "script_score": {
                                "script": {
                                "source": "cosineSimilarity(params.queryVector, 'Vector') + 1.0",
                                "params": {
                                    "queryVector": t_vec
                                }
                                            }
                                }
                            }
                            
                        ]
                        }
                    }
                })   
                hit_num = res['hits']['total']['value']
                #print(hit_num)
                #print(label)
                
                title_list = []
                text_list = []
                publisher_list = []
                score_list = []
                label_list = []
                ID_list = []
                for doc in res['hits']['hits']:
                    dict1 = doc['_source']
                    score_list.append(doc['_score'])
                    label_list.append(dict1['Label'])
                    title_list.append(dict1['Title'])
                    text_list.append(dict1['Text'])
                    ID_list.append(dict1['ID'])
                    publisher_list.append(dict1['Publisher'])

                hit = []
                hit30 = []
                hit40 = []
                hit50 = []

                if len(title_list) <= 21:
                    for i in range(len(title_list)):
                        hit.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                    del hit[0]

                elif len(title_list) <= 31:
                    for i in range(21):
                        hit.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                    del hit[0]
                    for i in range(21,len(title_list)):
                        hit30.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                
                elif len(title_list) <= 41:
                    for i in range(21):
                        hit.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                    del hit[0]
                    for i in range(21,31):
                        hit30.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                    for i in range(31,len(title_list)):
                        hit40.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                
                elif len(title_list) <= 51:
                    for i in range(21):
                        hit.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                    del hit[0]
                    for i in range(21,31):
                        hit30.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                    for i in range(31,41):
                        hit40.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                    for i in range(41,len(title_list)):
                        hit50.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                
                else:
                    for i in range(21):
                        hit.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                    del hit[0]
                    for i in range(21,31):
                        hit30.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                    for i in range(31,41):
                        hit40.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                    for i in range(41,51):
                        hit50.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
                t2 = time.time()
                l_time = t2 - t1
                print(f"label:{l_time}")
                return render_template("search.html", time =l_time ,label = label, hits = hit_num, hit = hit, l = t_label, ti = t_title, te = t_text, p = t_publisher, I = t_id, hit30 = hit30, hit40 = hit40, hit50 = hit50)
        
            else:
                return render_template('form_error.html')

    elif mode_r == 'secondary':
        t3 = time.time()
        ID = str(query_r)

        f_res = es.search(index = 'sample00', body = {
                '_source':['Vector'],
                'size':1,
                'query':{
                    "match":{"ID": query_r }
                }})
        for doc in f_res['hits']['hits']:
            dict1 = doc['_source']
            t_vec = dict1['Vector']

        res = es.search(index = 'sample00', body = {
                '_source':['Label', 'Title', 'Text','Publisher', 'ID'],
                'size': 51,
                "query": {
                    "function_score": {
                    "query": {
                        "match_all": {}
                    },
                    "functions": [
                        {
                        "script_score": {
                            "script": {
                            "source": "cosineSimilarity(params.queryVector, 'Vector') + 1.0",
                            "params": {
                                "queryVector": t_vec
                            }
                                        }
                            }
                        } 
                    ]
                    }
                }
            })
        
        title_list = []
        text_list = []
        publisher_list = []
        score_list = []
        label_list = []
        ID_list = []

        for doc in res['hits']['hits']:
            dict1 = doc['_source']
            score_list.append(doc['_score'])
            label_list.append(dict1['Label'])
            title_list.append(dict1['Title'])
            text_list.append(dict1['Text'])
            ID_list.append(dict1['ID'])
            publisher_list.append(dict1['Publisher'])

        hit = []
        hit30 = []
        hit40 = []
        hit50 = []

        if len(title_list) <= 21:
            for i in range(len(title_list)):
                hit.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
            del hit[0]

        elif len(title_list) <= 31:
            for i in range(21):
                hit.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
            del hit[0]
            for i in range(21,len(title_list)):
                hit30.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
        
        elif len(title_list) <= 41:
            for i in range(21):
                hit.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
            del hit[0]
            for i in range(21,31):
                hit30.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
            for i in range(31,len(title_list)):
                hit40.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
        
        elif len(title_list) <= 51:
            for i in range(21):
                hit.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
            del hit[0]
            for i in range(21,31):
                hit30.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
            for i in range(31,41):
                hit40.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
            for i in range(41,len(title_list)):
                hit50.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
        
        else:
            for i in range(21):
                hit.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
            del hit[0]
            for i in range(21,31):
                hit30.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
            for i in range(31,41):
                hit40.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})
            for i in range(41,51):
                hit50.append({'title': title_list[i], 'publisher': publisher_list[i], 'text': text_list[i], 'ID': ID_list[i], 'distance': score_list[i], 'label': label_list[i]})

        for i in range(1,11):
            json_l = {'Title':title_list[i], 'Text':text_list[i]}
            print(json.dumps(json_l))
        

        t4 = time.time()
        v_time = t4 - t3
        print(f"vector:{v_time}")
        return render_template("search-card.html",time = v_time, hit = hit, hit30 = hit30, hit40 = hit40, hit50 = hit50)

    else:
        return render_template('error.html')

if __name__ == "__main__":
    app.run(host='153.120.135.103', port = 80, debug=True)