J'ai besoin d'aide mise en œuvre d'une recherche par mot-clé dans la Fiole Jaugée-msearch

0

La question

Je suis l'aide de la version 3.9 de python et de tenter de créer un mot clé de recherche, où l'utilisateur peut saisir une chaîne de mots-clés et que la chaîne peut être interrogée sur la base de données contenant des chaînes de caractères. Il n'y a pas d'erreurs de compilation et tout fonctionne, mais le résultat de la requête n'est pas ce que j'attends. Au lieu de renvoyer toutes les lignes qui contiennent des mots similaires pour le mot-clé dans la colonne description, il renvoie la requête dans la forme d'une chaîne.

C'est mon init.py fichier:

import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_msearch import Search
...
app = Flask(__name__)
searched = Search(app)
searched.init_app(app)
searched.create_index(update=True)
MSEARCH_INDEX_NAME =  os.path.join(app.root_path,'msearch')
MSEARCH_ENABLE = True
from .search import search as search_blueprint
app.register_blueprint(search_blueprint)

return app

C'est mon models.py fichier

class Service (db.Model):
    __searchable__  = ['description']
    provider_id     = db.Column(db.Integer, db.ForeignKey('provider.provider_id'), nullable=False)
    service_id      = db.Column(db.Integer, nullable=False, primary_key=True)
    rating_avg      = db.Column(db.Float(precision=2), nullable=False)
    service_name    = db.Column(db.String(20), nullable=False)
    cost            = db.Column(db.Float(precision=2), nullable=False)
    description     = db.Column(db.String(255), nullable=False)
    category        = db.Column(db.String(20), nullable=False)
    
    def __repr__(self):
        return 'String representation of Service'

C'est mon search.py fichier:


search = Blueprint('search', __name__)

@search.route('/search')
def searching():
    return render_template('search.html')

@search.route('/search', methods=['POST'])
def searching_post():
    searchInput = request.form.get('searchInput')
    results = Service.query.msearch(searchInput, fields= ['description'])
    return render_template('result.html', results=results)

C'est mon search.html fichier de modèle:

{% extends "base.html" %}

{% block content %}
<div class="column is-8 is-offset-2">
    <h1 class ="title">
    Enter keywords and minimum rating
    </h1>
    <div class="box">
        <form method="POST" action="/search">
        <div class="field">
                    <div class="form-group">
                    <input class="input is-large" type="text" name="searchInput" placeholder=" " autofocus="">
                    </div>
                </div>
        <button class="button is-block is-info is-large is-fullwidth">Search</button>
         </form>
    </div>
</div>
{% endblock %}

C'est le résultat que j'obtiens quand je recherche quelque chose dans la barre de recherche:

Results: SELECT service.provider_id AS service_provider_id, service.service_id AS service_service_id, service.rating_avg AS service_rating_avg, service.service_name AS service_service_name, service.cost AS service_cost, service.description AS service_description, service.category AS service_category FROM service WHERE (service.description LIKE '%' || ? || '%')!
elasticsearch flask python whoosh
2021-11-21 22:29:36
1

La meilleure réponse

1

msearch retourne un Query objet et lorsque vous imprimez votre results variable de vous voir à sa représentation sous forme de chaîne - le sous-jacent de la requête SQL.

Pour obtenir les résultats réels que vous devez executer la requête, par exemple

results = Service.query.msearch(searchInput, fields= ['description']).all()

La suite des appels de méthode serait également entraîner l'exécution de la requête sous-jacente:

results = Service.query.msearch(searchInput, fields= ['description']).first()
results = Service.query.msearch(searchInput, fields= ['description']).one()
results = Service.query.msearch(searchInput, fields= ['description']).one_or_none()
2021-11-22 10:02:07

J'ai effectivement trouvé l'erreur, c'est lié, mais j'étais en manque juste la .tous les() à la fin des résultats = Service.de la requête.msearch(searchInput, champs= ['description']).tous les()
Ali Khabib

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................