这是 search api java 的简单代码,只创建一个文档并添加到索引中
我们正在使用 app engine java sdk 1.7.6 和 objectify4.0 beta 1
在线部署时相同的代码有效,但在本地主机上无效
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.appengine.api.search.Document;
import com.google.appengine.api.search.Field;
import com.google.appengine.api.search.Index;
import com.google.appengine.api.search.IndexSpec;
import com.google.appengine.api.search.PutException;
import com.google.appengine.api.search.Results;
import com.google.appengine.api.search.ScoredDocument;
import com.google.appengine.api.search.SearchException;
import com.google.appengine.api.search.SearchService;
import com.google.appengine.api.search.SearchServiceFactory;
import com.google.appengine.api.search.StatusCode;
public class Search extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
String query=req.getParameter("query");
out.println("<h1> this is the search query is="+query+"</h1>");
SearchService searchService = SearchServiceFactory.getSearchService();
Index indexe = searchService.getIndex(
IndexSpec.newBuilder().setName("indexName").build());
Document doc = Document.newBuilder()
.setId("docid")
.addField(Field.newBuilder().setName("id").setNumber(111.1))
.addField(Field.newBuilder().setName("info").setText("hello"))
.addField(Field.newBuilder().setName("service").setText("hello is the")).build();
try {
// Put the document.
// here nosuchmethod error comnes
indexe.put(doc);
} catch (PutException e) {
if (StatusCode.TRANSIENT_ERROR.equals(e.getOperationResult().getCode())) {
// retry putting the document
}
}
try {
// Query the index.
Results<ScoredDocument> results = indexe.search("service name:"+query);
for (ScoredDocument document : results) {
// Use the document for display.
List<Field>rs= document.getExpressions();
int t=0;
while(t<rs.size())
{
Field f=rs.get(t);
out.println(f.getText());
t++;
}
}
} catch (SearchException e) {
if (StatusCode.TRANSIENT_ERROR.equals(e.getOperationResult().getCode())) {
// retry
}
}
}
}
问题是何时将文档放入索引中。这是引发 NoSuchMethod 错误的块。
try {
// Put the document.
// here nosuchmethod error comnes
indexe.put(doc);
} catch (PutException e) {
if (StatusCode.TRANSIENT_ERROR.equals(e.getOperationResult().getCode())) {
// retry putting the document
}
}
下面是 Index.put() 方法返回的错误
HTTP ERROR 500
Problem accessing /Search. Reason:
com.google.appengine.api.search.Index.put([Lcom/google/appengine/api/search/Document;)
Lcom/ google/appengine/api/search/PutResponse;
Caused by:java.lang.NoSuchMethodError: com.google.appengine.api.search.Index.put([Lcom/google/appengine/api/search/
Document;Lcom/google/appengine/api/search/PutResponse;
at microService.Search.doGet(Search.java:77)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.googlecode.objectify.cache.AsyncCacheFilter.doFilter(AsyncCacheFilter.java:59)
at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:49)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)