App Engine 全文搜索 API (Java)

2023-12-10

我一直在尝试使用 Google AppEngine 的实验性搜索 API。我使用的是 SDK 1.6.6。 到目前为止,我可以将条目添加到索引并在我的开发环境中搜索它。 当我部署应用程序时,我仍然可以向索引添加条目,但是当我尝试 执行搜索,我得到以下异常日志:

br.com.qmagico.server.service.search.GenericSearchService search: Busca com query 'soma' falhou
com.google.appengine.api.search.SearchException: 
at com.google.appengine.api.search.IndexImpl$3.convertException(IndexImpl.java:268)
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:106)
at com.google.appengine.api.search.FutureHelper.getInternal(FutureHelper.java:74)
at com.google.appengine.api.search.FutureHelper.quietGet(FutureHelper.java:33)
at com.google.appengine.api.search.IndexImpl.search(IndexImpl.java:390)
at br.com.qmagico.server.service.search.GenericSearchService.search(GenericSearchService.java:109)
at br.com.qmagico.server.service.search.AulaSearchService.search(AulaSearchService.java:50)
at br.com.qmagico.server.handler.GetAulasHandler.executeLoggedException(GetAulasHandler.java:45)
at br.com.qmagico.server.handler.GetAulasHandler.executeLoggedException(GetAulasHandler.java:1)
at br.com.qmagico.server.QmActionHandler.execute(QmActionHandler.java:23)
at com.gwtplatform.dispatch.server.AbstractDispatchImpl.doExecute(AbstractDispatchImpl.java:153)
at com.gwtplatform.dispatch.server.AbstractDispatchImpl.execute(AbstractDispatchImpl.java:111)
at com.gwtplatform.dispatch.server.AbstractDispatchServiceImpl.execute(AbstractDispatchServiceImpl.java:81)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_$1.run(Method_.java:165)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.privilegedInvoke(Method_.java:163)
at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke_(Method_.java:124)
at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke(Method_.java:43)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263)
at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:178)
at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:62)
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:249)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:477)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)
at com.google.tracing.TraceContext.runInContext(TraceContext.java:695)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453)
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
at java.lang.Thread.run(Thread.java:679)

执行此搜索的代码如下:

public List<Long> search(Index index, String queryStr, String sortField) {
    ArrayList<Long> ids = new ArrayList<Long>();
    if (queryStr != null && !queryStr.isEmpty()) {
        int limit = 5;
        try {
            QueryOptions.Builder builder = QueryOptions.newBuilder().setLimit(limit);
            if (sortField != null) {
                builder = builder.setSortOptions(SortOptions.newBuilder()
                    .addSortExpression(SortExpression.newBuilder()
                        .setExpression(sortField)
                        .setDefaultValue("")
                        .setDirection(SortExpression.SortDirection.DESCENDING))
                    .build());
            }
            QueryOptions queryOptions = builder.build();

            Query query = Query.newBuilder()
                .setOptions(queryOptions)
                .build(queryStr);
            LOG.info("Enviando query " + query);
            Results<ScoredDocument> results = index.search(query);
            for (ScoredDocument scoredDoc : results) {
                ids.add(scoredDoc.getOnlyField("id").getNumber().longValue());
            }
        } catch (RuntimeException e) {
            LOG.log(Level.SEVERE, "Busca com query '" + queryStr + "' falhou", e);
        }
    }
    return ids;
}

有人知道我应该做什么来解决这个问题吗?

Thx!


如果您认为排序是您的问题,那么您可能需要考虑使用文档排名对索引中的文档进行预排序。文档中的排名字段默认设置为自 2011 年 1 月 1 日以来的秒数。但是,您可以提供整数排名值。例如,如果您想按价格对产品目录进行排序(从低到高,从高到低)。排名用于对索引中的文档进行预排序。

public Index getIndex(String indexName) {
    IndexSpec indexSpec = IndexSpec.newBuilder().setName(indexName).build();
    return SearchServiceFactory.getSearchService().getIndex(indexSpec);
}

Document doc = Document.newBuilder()
    .addField(Field.newBuilder().setName('name').setText("some text"))
    .setRank(functionToGetPrice())
    .build();

getIndex("productHighToLow").put(doc);

doc = Document.newBuilder()
    .addField(Field.newBuilder().setName('name').setText("some text"))
    .setRank(MAXINT-functionToGetPrice())
    .build();

getIndex("productLowToHigh").put(doc);

然后,当您搜索索引时,如果用户选择了“价格从低到高”并查询“LED TV”,那么您可以简单地发出如下查询

getIndex("productLowToHigh").search("LED TV");

即使对于大型(产品目录)索引,它也会更快且语义正确。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

App Engine 全文搜索 API (Java) 的相关文章

  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • Java替换特定字符

    这是我在这个网站上的第一个问题 所以我会尽量不要成为一个十足的菜鸟 我目前正在用java 创建刽子手游戏 所以我问你的问题是我们是否被赋予了 幽灵 这个词 并将 Ghost 替换为 hiddenWord ghost length for i
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • Java:VM 如何在 32 位处理器上处理 64 位“long”

    JVM 如何在 32 位处理器上处理 64 位的原始 long 在多核 32 位机器上可以并行利用多个核心吗 64 位操作在 32 位机器上慢了多少 它可能使用多个核心来运行不同的线程 但不会并行使用它们进行 64 位计算 64 位长基本上
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 为什么 ConcurrentHashMap::putIfAbsent 比 ConcurrentHashMap::computeIfAbsent 更快?

    使用 ConcurrentHashMap 我发现computeIfAbsent 比putIfAbsent 慢两倍 这是简单的测试 import java util ArrayList import java util List import
  • 从 Java 日历迁移到 Joda 日期时间

    以前 当我第一次设计股票应用相关软件时 我决定使用java util Date表示股票的日期 时间信息 后来我体会到了大部分方法java util Date已弃用 因此 很快 我重构了所有代码以利用java util Calendar 然而
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 如何在keycloak中动态编辑standalone.xml文件

    我正在尝试通过 docker 编辑standalone xml 并尝试添加 但 keycloak 正在使用它standalone xml 但我可以看到standalone xml 文件中的更改 我需要在standalone xml 文件中添
  • 阻止 OSX 变音符号为所有用户禁用 Java 中的 KeyBindings?

    注 我知道这个问题 https stackoverflow com questions 40335285 java keybinds stop working after holding down a key用户必须输入终端命令才能解决此问
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • Java中获取集合的幂集

    的幂集为 1 2 3 is 2 3 2 3 1 2 1 3 1 2 3 1 假设我有一个Set在爪哇中 Set

随机推荐

  • 使用手风琴样式平滑 UITableView 单元格扩展

    我的表格视图可以在按下单元格时展开和折叠单元格 但单元格展开时显示的内容会在动画完成之前加载 我剩下的是这样的 我希望它看起来像什么这个例子 该内容看起来就像是在幕布后面 而单元格扩展动画只是将其揭示出来 这是控制表视图的代码 class
  • 如何将 nsdata 转换为 MPMediaitem 歌曲 iOS Sdk

    我将 MPMediaItem 转换为 NSData 并将其存储在数据库中 现在我必须将该 NSData 转换为 MPMediaItem 才能在媒体播放器中播放该歌曲 使用下面的代码将 MPMediaItem 转换为 NSData NSURL
  • 角度 url 添加不需要的字符

    我有一个项目 在本地工作时 URL 工作正常 方法是 本地主机 9000 URL 将变为 http 本地主机 9000 由于我做了一些更改 现在转到 http localhost 9000 带感叹号 另外 其他 URL 也会变得很奇怪 例如
  • argparse 支持多个独占参数吗?

    假设我有两组论点 您可以使用每个组中任意数量的参数 但不能在组之间混合参数 有没有办法自定义冲突的参数argparse模块 我尝试过使用方法add mutually exclusive group但这不是我要找的 我提出了一个补丁 或者更确
  • 使用 jdk8 Conscrypt 为 http2 启用 ALPN

    我一直在寻找如何实施密码加密SSL 提供商使用conscrypt openjdk uber 1 4 1 jarjdk8支持ALPN为了制作一个http2 使用apache httpclient 5 到服务器的连接为jdk8默认不支持ALPN
  • 从浏览器使用 Selenium

    我想从 Web 应用程序运行和控制浏览器窗口 以在另一个站点上自动执行某些操作 例如帐户创建等 所以我的问题是 有没有办法直接从浏览器使用 selenium 来做到这一点 在这种情况下该怎么做 我知道有用于 JS 的 selenium we
  • MessageBody 写入器/读取器

    我正在努力让泽西岛得到 支持GSON为此 我读到我需要实施一个自定义消息体编写器 and 消息体读取器 现在我的问题是我找不到这两个接口的任何明确定义 来自文档 public interface MessageBodyWriter
  • barplot() 中的标签

    我正在尝试将名称添加到条形图的列中 每组中有 2 个条形图共享相同的名称 我正在使用这样的代码 l lt c 6286 2212 9961 5831 8703 6990 9952 9948 r lt c 2721 5663 0 3961 0
  • 如何在列表视图中添加复选框?

    我有一个问题 被困了一段时间 我不知道如何在列表中添加复选框 例如 如果我有一个项目列表 我希望能够检查它们 我的xml代码如下
  • 如何将应用程序下载到 iOS 模拟器?

    最近的更新应用程序商店在模拟器中不可用 我想下载 twitter facebook 等应用程序来实现一些 UITests 我怎样才能做到这一点 这只能使用物理设备来实现 据我所知 App Store 从未在模拟器中可用
  • 如何在 swagger 上添加多个示例项目

    需要有关如何在 swagger 上执行此操作的帮助 SWG Property property LineItems type array SWG Items ref definitions LineItem SWG Definition d
  • 为什么 typeof(Function.prototype) 是函数

    我知道原型是对象文字这一事实 因此可以在它们上定义方法和属性 Function prototype有一些方法 如 apply call bind toString 等 所以我认为函数的原型应该是对象文字 但我运行以下代码并遇到了这个Func
  • 连续分析范围内的随机数生成器

    我可以使用以下命令从一定范围内创建随机数 Random rand new Random int num rand nextInt 10 System out println Generated Random Number between 0
  • CSS3 旋转动画

    我已经查看了相当多的演示 但不知道为什么我无法让 CSS3 spin 运行 我正在使用 Chrome 的最新稳定版本 小提琴 http jsfiddle net 9Ryvs 1 div margin 20px width 100px hei
  • JavaScript 功能和 UI 更新

    我有一个以下函数 它将相对定位的元素从现在的位置滑动 1000px for var i 0 i lt 1000 i my element css left parseInt my element css left 10 1 这不会产生滑动效
  • 使用 JavaScript Promise 实现多线程

    只是学习承诺 JavaScript 是单线程的吗 那么当它使用 fetch api 发出 http 请求时 这一切都发生在一个线程中吗 那么它如何管理 PromisePool 的并发呢 var p Promise p then stuff1
  • 应用栅格 netlogo gis 时扩展异常:1944553

    我正在尝试使用 GIS 扩展中的 apply raster 将 ascii 加载到 Netlogo 中 虽然我之前多次这样做过 尽管不是使用这个特定的 ascii 但 netlogo 现在会抛出以下错误 extension exceptio
  • 如何使用键值对列表查询数据库

    假设我有一个包含 3 列的表 ID 类别 名称 我想这样查询表 获取对应的行 Category Cat1 AND Name ABC OR Category Cat2 AND Name ABC OR Category Cat2 AND Nam
  • HTML 表单提交不适用于 Spring Boot 2.3.1

    从 Spring Boot 2 2 7 切换到 Spring Boot 2 3 1 后 针对我的具体情况提交表单时的实体转换不再起作用 类别 java Entity Getter Setter public class Category i
  • App Engine 全文搜索 API (Java)

    我一直在尝试使用 Google AppEngine 的实验性搜索 API 我使用的是 SDK 1 6 6 到目前为止 我可以将条目添加到索引并在我的开发环境中搜索它 当我部署应用程序时 我仍然可以向索引添加条目 但是当我尝试 执行搜索 我得