クラスをできるだけ少なくしたいので、ご想像のとおり、JAXB および Solr アノテーション付きの POJOを作成して、XML を使用し、それを Company オブジェクトにマーシャリングしてインデックスを付けたいと考えています。
マーシャリングに問題はありません。Company オブジェクトは問題なく構築されます。私が抱えている問題は、 Company POJO に注釈を付けて複数値の文字列 solr フィールドを作成する方法です。
XML は次のようになります。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<company>
<registryNumber>5226805000</registryNumber>
<names>
<name>name1</name>
<name>name2</name>
</names>
</company>
Company POJO に対する私の現在の哀れな試みは次のようになります。
@XmlRootElement(name = "company")
public class Company {
public Company() {}
@XmlElement
@Field("id")
public String registryNumber;
public static class Names {
public Names() {}
@XmlElement(name = "name")
@Field("title")
public List<Name> name;
public static class Name {
public Name() {}
@XmlValue
public String value;
}
}
@XmlElement(name = "names")
public Names names;
}
私が作成した 2 つの単体テスト:
public class CompanySearchTest extends AbstractSolrTestCase {
private SolrServer server;
private Company company;
@Before
@Override
public void setUp() throws Exception {
super.setUp();
server = new EmbeddedSolrServer(h.getCoreContainer(), h.getCore().getName());
company = new Company();
company.registryNumber = "5226805000";
Company.Names.Name name1 = new Company.Names.Name();
name1.value = "name1";
Company.Names.Name name2 = new Company.Names.Name();
name1.value = "name2";
Company.Names names = new Company.Names();
names.name = Arrays.asList(name1, name2);
server.addBean(company);
server.commit();
}
@After
public void destroy() {
h.getCoreContainer().shutdown();
}
@Test
public void searchByIdTest() throws IOException, SolrServerException {
SolrQuery query = new SolrQuery();
query.setQuery("id:5226805000");
QueryResponse response = server.query(query);
List<Company> companiesFound = response.getBeans(Company.class);
assertEquals(1L, companiesFound.size());
assertEquals("5226805000", companiesFound.get(0).registryNumber);
}
@Test
public void searchByMultivalueNameTest() throws IOException, SolrServerException {
SolrQuery query = new SolrQuery();
query.setQuery("title:name1");
QueryResponse response = server.query(query);
List<Company> companiesFound = response.getBeans(Company.class);
assertEquals(1L, companiesFound.size());
assertEquals("name1", companiesFound.get(0).names.name.get(0).value);
}
@Override
public String getSchemaFile() {
return "solr/collection1/conf/schema.xml";
}
@Override
public String getSolrConfigFile() {
return "solr/collection1/conf/solrconfig.xml";
}
}
テスト searchByIdTest() はパスしますが、searchByMultivalueNameTest() は次のように検索しても会社が見つからないため、惨めに失敗します。
query.setQuery("title:name1");
私が使用している solr スキーマは、solr 4.0.0 で提供されています (コレクション 1 の例)。
可能であれば、会社の POJO に注釈を付ける方法や、どのような変更を加える必要があるかについて、誰かがヒントを教えてくれますか。
目標は、solr スキーマの例で次のように定義されているよう<name>name1</name>
に<name>name2</name>
、複数値の solr 文字列フィールドとしてインデックスを作成することです。
<field name="title" type="text_general" indexed="true" stored="true" multiValued="true"/>
その会社は、「title:name1」または「title:name2」で検索して見つけることができます。
どうもありがとう!