1

这是 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)
4

2 回答 2

2

我也遇到了同样的问题。问题不在于对象化,而在于库中 jar 的版本冲突。因此,引发了 No such method 错误。如果您在库中有不同版本的相同 jar,只需删除您不使用的那个。我在 lib 文件夹中有两个版本的 appengine-api-sdk,删除一个我没有使用的版本解决了我的问题。

于 2013-06-04T17:19:53.490 回答
0

这是一个优秀的谷歌应用引擎全文搜索框架。该框架使将 POJO 转换为可搜索文档变得简单。

http://www.vidolima.com/projects/doco/

于 2014-12-04T22:07:18.580 回答