1

クラスをできるだけ少なくしたいので、ご想像のとおり、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」で検索して見つけることができます。

どうもありがとう!

4

2 に答える 2

1

問題は、SolrJが複数値フィールドの複合型をサポートしていないことです。この前の質問を参照してください-solrj:インデックスの複数値フィールドを介してリストを保存および取得する方法

フィールド定義を次のように変更する必要があります。

    @XmlElement(name = "name")
    @Field("title")
    public List<String> name;
于 2012-12-18T13:17:26.587 に答える
1

ペイジが指摘したように:

SolrJ は複数値フィールドの複合型をサポートしていません

Company POJO を変更しました (自分のコードの行を削除するのが大好きです!):

@XmlRootElement(name = "company")
public class Company {
    public Company() {}

    @XmlElement
    @Field("id")
    public String registryNumber;

    @XmlElementWrapper(name = "names")
    @XmlElement(name = "name")
    @Field("title")
    public List<String> names;
}

もちろん、XML は同じままです。

単体テストの setUp() メソッドも単純化されています。

@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= Arrays.asList("name1", "name2");

    server.addBean(company);
    server.commit();
}

アサーションも単純化されていますが、正しい検索が行われていることを確認するために、さらに 2 つのクエリを追加しました。

@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.get(0));

        // 2nd query
        query.clear();
        query.setQuery("title:name2");

        response = server.query(query);

        companiesFound = response.getBeans(Company.class);

        assertEquals(1L, companiesFound.size());
        assertEquals("name2", companiesFound.get(0).names.get(1));

        // 3rd query
        query.clear();
        query.setQuery("title:name1 AND title:name2");

        response = server.query(query);

        companiesFound = response.getBeans(Company.class);

        assertEquals(1L, companiesFound.size());
        assertEquals("name1", companiesFound.get(0).names.get(0));
        assertEquals("name2", companiesFound.get(0).names.get(1));      

    }

それでおしまい。他の誰かがこれが役立つことを願っています。

于 2012-12-19T09:06:42.877 に答える