У меня есть следующие функции поиска аннотированный класс (не полный, просто пытается заставить его работать прямо сейчас):Hibernate дикая карта результатов фраза поиска не оптимальные
Я пытаюсь получить его так, что, когда пользователь выполняет поиск для «foo ba» результаты будут появляться с строками, содержащими «foo bar», «foo bat» и т. д., но эти термины отображаются в одном поле. И.Е. если заголовок «foo» с идентификатором «bat», он не будет отображаться, тогда как строка с названием «foo bath» будет. Прямо сейчас, если хотя бы одно из слов появляется в любом из полей, оно возвращается, и сортировка тоже не работает (но это следующий шаг, поэтому я сейчас так не волнуюсь об этом).
@Entity
@Table(name="jobReq")
@Indexed
public class JobReq {
@Id
@DocumentId
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Field(index = Index.YES)
@Column(name="jobId", nullable=false, unique=true)
private String jobId;
@Field(index = Index.YES)
@Column(name="jobTitle", nullable=false)
private String jobTitle;
@Field(index = Index.YES)
@Column(name="jobContract", nullable=false)
private String contract;
@Field(index = Index.YES)
@Column(name="jobProject", nullable=true)
private String project;
@Field(index = Index.YES)
@Column(name="jobLaborCategory", nullable=false)
private String laborCategory;
@Field(index = Index.YES)
@Column(name="jobSummary", nullable=false)
private String summary;
@Field(index = Index.YES)
@Column(name="jobDescription", nullable=false)
private String jobDescription;
@Field(index=Index.YES)
@Column(name="jobStatus", nullable=false)
private String status;
@Field(index = Index.YES)
@Column(name="TTONumber", nullable=false)
private String TTONumber;
@Field(index = Index.YES)
@Column(name="jobPostedDate", nullable=false)
@Type(type="date")
private Date postedDate;
@Field(index = Index.YES)
@Column(name="jobModifiedDate", nullable=false)
@Type(type="date")
private Date modifiedDate;
public List<T> testingSearch() {
Session hibernateSession = this.getSession();
List<T> results;
SortField field =new SortField("jobStatus", SortField.STRING);
Sort sort = new Sort(field);
FullTextSession fullTextSession = Search
.getFullTextSession(hibernateSession);
fullTextSession.beginTransaction();
Term firstTerm = new Term("jobTitle", "entry");
Term secondTerm = new Term("jobTitle", "ar");
Term[] tTerms = new Term[] { firstTerm, secondTerm };
MultiPhraseQuery multiPhrasequery = new MultiPhraseQuery();
try {
File index = new File("I:/com.portal.application.model.JobPosition");
Directory indexDirectory = FSDirectory.open(index);
System.out.println(indexDirectory);
PrefixTermEnum reader = new PrefixTermEnum(IndexReader.open(indexDirectory), secondTerm);
System.out.println(reader.toString());
List<Term> termList = new LinkedList<Term>();
while (reader.docFreq() != -1) {
Term t = reader.term();
System.out.print(t);
if (t.field().equals("jobTitle") || t.text().startsWith(secondTerm.text())) {
termList.add(t);
}
reader.next();
}
Term[] terms = termList.toArray(new Term[0]);
multiPhrasequery.add(terms);
org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery(multiPhrasequery, this.type).setSort(sort);
results = hibQuery.list();
fullTextSession.getTransaction().commit();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
results = null;
}
return results;
}