我正在尝试使用vespa构建打字头搜索。由于有很多数据,我不想使用流媒体模式。通配符搜索是我期望看到的,但它看起来仅限于流模式(正则表达式和 match:子字符串仅适用于流模式)。任何关于如何实现它或自定义的指针将不胜感激。
我看到的应用程序为此所做的如下:
>
将所有文本放在属性数组中,并在该数组上设置快速搜索。这为您提供了一致的非常低的延迟,因为您只访问内存,并且能够使用前缀匹配。它禁用了全文相关性,但您不需要这样做。
使用前缀匹配,而不是子字符串。如果您想通过前缀匹配所有的术语,您可以在搜索定义中的字段上设置match: prefix。但是,只进行最后一个词的前缀匹配可能会给用户带来更好的体验。在这种情况下,保持默认匹配并重写查询(在搜索器中),改为最后一个WordItem和PrefixItem。
例如,您可以像这样定义搜索定义中的字段:
field suggestions type array<string> {
indexing: input myinputtextfield |split "\\s+" | summary | attribute
attribute: fast-search
}
要对最后一个词进行前缀匹配,请添加一个Searcher组件,该组件的作用如下:
import com.yahoo.prelude.query.CompositeItem;
import com.yahoo.prelude.query.Item;
import com.yahoo.prelude.query.PrefixItem;
import com.yahoo.prelude.query.WordItem;
import com.yahoo.search.Query;
import com.yahoo.search.Result;
import com.yahoo.search.Searcher;
import com.yahoo.search.query.QueryTree;
import com.yahoo.search.searchchain.Execution;
import java.util.ListIterator;
public class PrefixMatchSearcher extends Searcher {
@Override
public Result search(Query query, Execution execution) {
matchLastByPrefix(query);
return execution.search(query);
}
private boolean matchLastByPrefix(Query query) {
boolean spaceTerminated = query.getModel().getQueryString().endsWith(" ");
if (spaceTerminated) return false;
QueryTree tree = query.getModel().getQueryTree();
if (tree.getRoot() instanceof WordItem) {
tree.setRoot(toPrefixItem((WordItem) tree.getRoot()));
return true;
}
else if (tree.getRoot() instanceof CompositeItem) {
CompositeItem root = (CompositeItem) tree.getRoot();
for (ListIterator<Item> i = root.getItemIterator(); i.hasNext();) {
Item child = i.next();
if (i.hasNext()) continue; // Skip to last
if (child instanceof WordItem) {
i.set(toPrefixItem((WordItem)child));
return true;
}
}
}
return false;
}
private PrefixItem toPrefixItem(WordItem word) {
return new PrefixItem(word.getWord(), word.getIndexName());
}
}
问题内容: 我正在尝试在名为“ abc”的字段中搜索“ efg” c是Collection对象。我没有任何结果。我究竟做错了什么? 问题答案: 您正在生成,但查询应如下所示: 因此,尝试将代码更新为: 请记住,要使用搜索,您需要指定一个索引。查阅说明如何使用该文档的文档:http : //docs.mongodb.org/manual/reference/operator/query/text/
但我得到以下错误: 我错在哪里?
我想实现这样的目标: 下面是我不想做的一个例子(我真的很讨厌JS中的重载黑客): 如何在TypeScript语言中做方法重载?
//错误
我需要在身份验证后从LDAP中检索各种值,如描述、办公室等。 我已经能够完成身份验证,但无法检索其他值。 我应该使用什么名称来检索完整的数据?? 请帮助。 我的代码如下:
问题内容: 我有一个对象列表,列表很大。对象是 现在,我必须在列表中搜索对象的特定值。假设 我必须返回那些对象(我的搜索并不总是基于value3) 清单是 有效的方法是什么? 谢谢。 问题答案: 您可以尝试使用Apache Commons Collections。 有一个CollectionUtils类,允许您通过自定义谓词选择或过滤项目。 您的代码将如下所示: 更新: 在 java8中 ,使用