1

因此,我的 ReactiveSearch 工作正常,但我注意到在初始加载时它会执行查询以获取项目 - 鉴于我的索引中可能有一百万个项目,我理想情况下希望将其关闭并且只返回来自的结果自动建议?

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

编辑我还尝试添加默认值以尝试停止初始查询返回数据。但它似乎没有按预期工作。

defaultValue="3245423 kjhkjhkj 2kj34h12jkh 213k4jh12"

编辑2:

我还尝试了以下格式的 defaultQuery 并将其添加到 reactiveList 和 dataSearch 组件这给了我一个未定义的错误不是对象'this.defaultQuery.sort' - 如果我向两个查询添加排序它没有区别:

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

3 回答 3

3

我知道这是一个老问题,但我偶然发现了同样的问题。

我的解决方案看起来有点不同 - 使用 onQueryChange 道具。

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

这将禁用 ResultList 并显示所有结果,并且仅在您选择任何过滤器或输入搜索词后才显示结果。

于 2019-12-18T12:53:45.017 回答
1

所以这是一个答案,您将通过搜索框单击的值存储在 state 中,然后从那里摆弄 defaultQuery。注意默认查询 match_none: {} 如果没有搜索文本。

这有点低效,因为您仍然执行不返回任何内容的查询,但它有效 - 我将保留这个问题以提供更好的答案时间。

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

于 2019-06-27T10:47:49.047 回答
0

选择的答案非常有用,但我更改了defaultQuery以在存在搜索词的情况下使用原始查询:

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

  }
}}
于 2020-06-16T17:04:43.757 回答