Postgres db のデータ (多言語文字を含む) にインデックスを付ける Solr 4.0 があります。組み込みの Jetty を介して Solr に直接リクエストを送信すると、正しいレスポンスが JSON 形式で返されます。Tomcat 7 で実行されているサーブレットがあり、パブリック API へのリクエストを処理します。この API は、HTTP 経由でリクエストを取得し、リクエストを実行する権利について何らかのチェックを行い、次に solrj を使用して Solr にリクエストを実行し、JSON として応答を送信します。問題は、サーブレットを介してSolrをリクエストしているとき、常に多くの?????????を取得することです。国際文字があるべき場所の記号。DB のすべてのデータは UTF-8 エンコーディングであり、Tomcat の server.xml の URIEncoding パラメータも UTF-8 です。これは私がサーブレットで応答を書いている方法です:
public void service(HttpServletRequest req, HttpServletResponse res) throws IOException
{
PrintWriter writer = res.getWriter();
String encoding = req.getCharacterEncoding();
if(null == encoding)
{
req.setCharacterEncoding("UTF-8");
}
else
{
req.setCharacterEncoding(encoding);
}
res.setContentType("application/json; charset=UTF-8");
res.setCharacterEncoding("UTF-8");
String key = req.getParameter(P_KEY);
if (ps.isPartnerKey(key))
{
if (req.getMethod().equals(M_GET))
{
String query = req.getParameter(P_QUERY);
String solr_json = SolrService.getInstance().query(query);
//parse JSON for id's and get images
if (solr_json != null)
{
writer.println(solr_json);
}
}
if (req.getMethod().equals(M_POST))
{
String id = req.getParameter(P_ID);
String field = req.getParameter(P_FIELD);
String value = req.getParameter(P_VALUE);
SolrService.getInstance().partialUpdate(id, field, value);
fs.add(id, field, value, ps.getPartnerId(key));
}
}
else
{
res.sendError(HttpServletResponse.SC_FORBIDDEN);
}
writer.close();
}
そして、これがSolrからデータを取得する方法です:
public String query(String query)
{
SolrQuery solrQuery = new SolrQuery();
solrQuery.set("q", query!=null ? query : "*:*");
solrQuery.set("wt", "json");
String response = "";
try
{
QueryResponse res = solr.query(solrQuery);
response = res.getResults().toString();
log.debug(response);
}
catch (SolrServerException e)
{
e.printStackTrace();
}
return response;
}
私は何か間違ったことをしていますか?問題は何ですか?