1
votes

ReactiveSearch comment arrêter la requête initiale au chargement

Donc, ReactiveSearch fonctionne bien, mais j'ai remarqué que lors du chargement initial, il exécute une requête pour récupérer des éléments - étant donné que mon index contiendra peut-être un million d'éléments, je voudrais idéalement désactiver cette option et uniquement renvoyer les résultats de l'autosuggest?

              defaultQuery={() => 
                {
                  query: {
                    match_none: {}
                  }
                }
              }

MODIFIER J'ai également essayé d'ajouter la valeur par défaut afin d'essayer d'arrêter la requête initiale renvoyant des données. Mais cela ne semble pas fonctionner comme prévu.

defaultValue="3245423 kjhkjhkj 2kj34h12jkh 213k4jh12"

EDIT 2:

J'ai également essayé defaultQuery dans le format suivant et l'ai ajouté à les composants reactiveList et dataSearch cela me donne une erreur qui n'est pas définie n'est pas un objet 'this.defaultQuery.sort' - si j'ajoute un tri aux deux requêtes, cela ne fait aucune différence:

       <ReactiveBase
        app="tths-shop-items"
        url="my-es-cluster"
        credentials="user:password"
        >
        <ScrollView>
          <View style={styles2.container}>
            <DataSearch
              componentId="searchbox"
              dataField={[
                'name'
              ]}
              placeholder="Search"
            />
            <ReactiveList
              componentId="results"
              dataField="name"
              size={7}
              showResultStats={true}
              pagination={true}
              react={{
                and: "searchbox"
              }}
              onData={(res) => {
              return (
                <View style={styles2.result}>
                  <Image source={{ uri: res.image.replace('http', 'https') }} style={styles2.image} />
                  <View style={styles2.item}>
                    <Text style={styles2.title}>{res.name}</Text>
                  </View>
                </View>
              )}
              }
            />
          </View>
        </ScrollView>
      </ReactiveBase>


0 commentaires

3 Réponses :


1
votes

Voici donc une réponse, vous stockez la valeur sur laquelle vous cliquez via la boîte de recherche dans l'état, puis vous tripotez la requête par défaut à partir de là. Notez que la requête par défaut ne match_none: {} s'il n'y a pas de texte de recherche.

C'est un peu inefficace car vous faites toujours une requête qui ne renvoie rien, mais cela fonctionne - je vais laisser cette question ouverte pour donner de meilleures réponses le temps de venir vers le haut.

        <ScrollView>
          <View style={styles.mainContainer}>
            <DataSearch
              componentId="searchbox"
              dataField={[
                'name'
              ]}
              placeholder="Search"
              queryFormat="and"
              noInitialQuery={true}
              onValueChange={(value) => { 
                if(value === ''){
                  this.setState({searchText: null})
                }

              }}
              onValueSelected={(value, cause, source) => {
                  this.setState({searchText: value.value})
                }
              }
              />
            <ReactiveList
              componentId="results"
              dataField="name"
              size={7}
              showResultStats={true}
              pagination={true}
              react={{
                and: "searchbox"
              }}
              defaultQuery={()=> {
                if(this.state.searchText !== null){
                  return {
                    query: {
                      match: {
                        name: this.state.searchText
                      }
                    }
                  }
                } else {
                  return {
                    query: {
                      match_none: {}
                    }
                  }

                }
              }}
              onData={(res) => {
              return (
                <View style={styles2.result}>
                  <Image source={{ uri: res.image.replace('http', 'https') }} style={styles2.image} />
                  <View style={styles2.item}>
                    <Text style={styles2.title}>{res.name}</Text>
                  </View>
                </View>
              )}
              }
            />
          </View>
        </ScrollView>


0 commentaires

3
votes

Je sais que c'est une vieille question, mais je suis tombé sur le même problème.

Ma solution semble un peu différente - avec la prop onQueryChange.

onQueryChange={
  function(prevQuery, nextQuery) {
    if ('match_all' in nextQuery['query']) {
      nextQuery['query'] = { match_none: {} }
    }
  }
}

Ceci désactivera la liste de résultats avec tous les résultats affichés et n'affichera les résultats qu'après avoir sélectionné un filtre ou entré un terme de recherche.


2 commentaires

Ooo gentil, je vais essayer! Bienvenue dans StackOverflow - si cela fonctionne, je marquerai ceci comme la bonne réponse car c'est une meilleure solution


Merci :) Avez-vous essayé?



0
votes

La réponse sélectionnée était très utile mais j'ai changé la defaultQuery pour utiliser la requête d'origine dans le cas où un terme de recherche serait présent:

defaultQuery={()=> {
  if(this.state.searchText !== null){
    return {
    }
  } else {
    return {
      query: {
        match_none: {}
      }
    }

  }
}}


0 commentaires