所以我的ReactiveSearch工作正常,但是我注意到在初始加载时它会执行查询以获取项目-鉴于我的索引中可能有100万个项目,我理想上想将其关闭,并且仅返回自动提示的结果?
<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并将其添加到reactList和dataSearch组件中,这给了我一个错误,它不是对象'this.defaultQuery.sort'的未定义-如果我向两个查询添加排序没有区别:
defaultQuery={() =>
{
query: {
match_none: {}
}
}
}
答案 0 :(得分:1)
我知道这是一个老问题,但是我偶然发现了同样的问题。
我的解决方案看起来有些不同-使用onQueryChange属性。
onQueryChange={
function(prevQuery, nextQuery) {
if ('match_all' in nextQuery['query']) {
nextQuery['query'] = { match_none: {} }
}
}
}
这将禁用显示所有结果的ResultList,并且仅在您选择任何过滤器或输入搜索词后才显示结果。
答案 1 :(得分:0)
所以这是一个答案,您将在状态下通过搜索框单击的值存储在状态中,然后从那里修改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>
答案 2 :(得分:0)
选择的答案非常有用,但是在出现搜索词的情况下,我将 defaultQuery 更改为使用原始查询:
defaultQuery={()=> {
if(this.state.searchText !== null){
return {
}
} else {
return {
query: {
match_none: {}
}
}
}
}}