Поиск строки из поля, разделенного запятыми, в solr

Я установил solr-6.5.1 в свой Spring MVC Java Web Application со ссылкой на следующую документацию: http://www.baeldung.com/apache-solrj

https://github.com/eugenp/tutorials/tree/master/apache-solrj/src/main/java/com/baeldung/solrjava

У меня есть POJO, как показано ниже:

public class WebContentSearchHB 
{
    private int webContentDefinitionId; 
    private String  pageTitle;
    private String  pageKwd;
    private String  pageDesc;
    private int siteId;
    private int applicationId;
    private Date    pageCreatedTime;
    private Date    pageUpdatedDate ;
    private String webContentData;
    private String webContentType;
    private String category;



    public int getWebContentDefinitionId() 
    {
        return webContentDefinitionId;
    }

    @Field("webContentDefinitionId")
    public void setWebContentDefinitionId(int webContentDefinitionId) 
    {
        this.webContentDefinitionId = webContentDefinitionId;
    }
    public String getPageTitle() 
    {
        return pageTitle;
    }

    @Field("pageTitle")
    public void setPageTitle(String pageTitle) 
    {
        this.pageTitle = pageTitle;
    }
    public String getPageKwd() 
    {
        return pageKwd;
    }

    @Field("pageKwd")
    public void setPageKwd(String pageKwd) 
    {
        this.pageKwd = pageKwd;
    }
    public String getPageDesc() 
    {
        return pageDesc;
    }

    @Field("pageDesc")
    public void setPageDesc(String pageDesc) 
    {
        this.pageDesc = pageDesc;
    }

    public int getSiteId() 
    {
        return siteId;
    }

    @Field("siteId")
    public void setSiteId(int siteId) 
    {
        this.siteId = siteId;
    }

    public int getApplicationId() 
    {
        return applicationId;
    }

    @Field("applicationId")
    public void setApplicationId(int applicationId) 
    {
        this.applicationId = applicationId;
    }

    public Date getPageCreatedTime() 
    {
        return pageCreatedTime;
    }

    @Field("pageCreatedTime")
    public void setPageCreatedTime(Date pageCreatedTime) 
    {
        this.pageCreatedTime = pageCreatedTime;
    }

    public Date getPageUpdatedDate() 
    {
        return pageUpdatedDate;
    }

    @Field("pageUpdatedDate")
    public void setPageUpdatedDate(Date pageUpdatedDate) 
    {
        this.pageUpdatedDate = pageUpdatedDate;
    }

    public String getWebContentData() 
    {
        return webContentData;
    }

    @Field("webContentData")
    public void setWebContentData(String webContentData) 
    {
        this.webContentData = webContentData;
    }

    public String getWebContentType() 
    {
        return webContentType;
    }

    @Field("webContentType")
    public void setWebContentType(String webContentType) 
    {
        this.webContentType = webContentType;
    }

    public String getCategory() {
        return category;
    }

    @Field("category")
    public void setCategory(String category) {
        this.category = category;
    }

}

Я не создавал ни одного файла schema.xml и не редактировал существующий файл schema.xml. Я вручную устанавливаю значения для каждого поля в POJO и добавляю их в индекс Solr, используя свое приложение следующим образом:

solrClient = new HttpSolrClient.Builder(solrUrl).build();
solrClient.setParser(new XMLResponseParser());
WebContentSearchHB searcHB = new WebContentSearchHB();
//codes to set data 
solrClient.addBean(searcHB);
solrClient.commit();

Я также добавил следующую зависимость maven в свой файл pom.xml

<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>6.5.1</version>
</dependency>

Одно из моих полей в WebContentSearchHB class с именем category будет содержать разделенную запятыми строку идентификаторов различных категорий для этого контента. Пример данных будет выглядеть так, как показано ниже:

[
{"pageTitle":["Test page"],
"pageKwd":["Test page"],
"pageDesc":["Test page"],
"applicationId":[1],
"siteId":[5],
"category":["2,6,7,8"],
"pageCreatedTime":["2017-02-17T05:58:19.648Z"],
"pageUpdatedDate":["2017-06-12T03:46:45.489Z"],
"webContentDefinitionId":[4947],
"webContentType":["simplewebcontent.html"],
"id":"717821d9-989e-4c4f-b66a-8b5185ed88ca",
"webContentData":"test"],
"_version_":1570012287149801472}
]

здесь есть несколько категорий, добавленных в виде значений, разделенных запятыми. Теперь, когда я пытаюсь найти данные в поле категории следующим образом:

http://localhost::8983/solr/swcm_qa/select?indent=on&q=category:7*&wt=json

данные не возвращаются. Но если я буду искать следующим образом,

 http://localhost::8983/solr/swcm_qa/select?indent=on&q=category:2*&wt=json

Возвращаются все строки, в которых 2 появляется в качестве первого значения в строке, разделенной запятыми. Как я могу найти строку среди значений, разделенных запятыми, в поле категории? Кроме того, как я могу указать, хранит ли поле несколько значений в виде строки, разделенной запятыми, в аннотации @Field?


person Geo Thomas    schedule 12.06.2017    source источник


Ответы (1)


В категории поле "2,6,7,8" индексируется как одна строка

category:["2,6,7,8"]

Это должно быть похоже

category:["2","6","7","8"]

Либо вы должны применить фильтр к этому полю category перед индексированием, чтобы оно сохраняло индивидуальное числовое значение в поле с разделителем ,as

OR

изменить запрос, например q=category:*7*

person Vinod    schedule 13.06.2017