首页 > 解决方案 > Spring Search Lucene - 术语拼写已更改

问题描述

这个问题简直是疯了。我已经把头撞在墙上了 3 个小时,试图找出导致这种情况的原因。

这个 POJO(删除了 getter 和 setter):

public class Author extends Auditable<String> implements Serializable {
    private static final long serialVersionUID = -590157884690722884L;
    @Id
    @DocumentId
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Expose
    private Long id;
    @Field(name = "firstName", store = Store.YES, analyze = Analyze.NO, termVector = TermVector.NO)
    @Column
    @Expose
    private String firstName;
    @Field(name = "middleName", store = Store.YES, analyze = Analyze.NO, termVector = TermVector.NO)
    @Column
    @Expose
    private String middleName;
    @Field(name = "lastName", store = Store.YES, analyze = Analyze.NO, termVector = TermVector.NO)
    @Column
    @Expose
    private String lastName;

有了这座桥:

public class AuthorBridge implements FieldBridge {
    @Override
    public void set(String s, Object o, Document document, LuceneOptions luceneOptions) {
        Author author = (Author) o;
        luceneOptions.addFieldToDocument(s + ".firstName", author.getFirstName(), document);
        luceneOptions.addFieldToDocument(s + ".lastName", author.getLastName(), document);
    }
}

在此文档 POJO 上(删除了获取器和设置器):

@Indexed
@Entity
@DiscriminatorValue("POEM")
public class Poem extends Item implements Serializable {
    private static final long serialVersionUID = 3631244231926795794L;
    @Field(name = SearchConstants.POEM_FORM, store = Store.YES, analyze = Analyze.NO, termVector = TermVector.NO)
    @Column
    private String form; // The form of genre of the poem.
    @Embedded
    private Confirmation confirmation;
    @Field(name = SearchConstants.TEXT, store = Store.YES, analyze = Analyze.YES, termVector = TermVector.YES)
    @Analyzer(definition = SearchConstants.TEXT_ANALYZER)
    @ElementCollection(fetch = FetchType.EAGER)
    @IndexedEmbedded
    private List<String> text;
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "annotation_id")
    private Annotation annotation;
    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @Fetch(value = FetchMode.SUBSELECT)
    private List<Version> versions;
    @JsonIgnore
    @Column
    private boolean processed;
    @Embedded
    private TopicModel topicModel;
    @Column
    private Integer pageNumber;

截断 author.lastName,仅使用莎士比亚的名字。(它把名字改成了shakespear)。

为什么 Lucene / Spring Search 这样做?有 1,000 份其他文件不会出现这种情况。只有莎士比亚的名字被截断。

这是应该映射到莎士比亚的 DB 对象:

在此处输入图像描述

标签: javaspringlucene

解决方案


好吧,解决方案非常简单。该字段是从 MappedSuperClass(项目)传递的,并且该字段的分析不正确。


推荐阅读