当前位置: 首页 > 知识库问答 >
问题:

如何在vespa中进行打字搜索?

龙弘济
2023-03-14

我正在尝试使用vespa构建打字头搜索。由于有很多数据,我不想使用流媒体模式。通配符搜索是我期望看到的,但它看起来仅限于流模式(正则表达式和 match:子字符串仅适用于流模式)。任何关于如何实现它或自定义的指针将不胜感激。

共有1个答案

阚原
2023-03-14

我看到的应用程序为此所做的如下:

>

  • 将所有文本放在属性数组中,并在该数组上设置快速搜索。这为您提供了一致的非常低的延迟,因为您只访问内存,并且能够使用前缀匹配。它禁用了全文相关性,但您不需要这样做。

    使用前缀匹配,而不是子字符串。如果您想通过前缀匹配所有的术语,您可以在搜索定义中的字段上设置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中 ,使用