2013-08-08 1 views
0

У меня есть следующие функции поиска аннотированный класс (не полный, просто пытается заставить его работать прямо сейчас):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; 
    } 

ответ

0

Fixed это, оказывается, я забыл добавить в первое слагаемое в поисковое XD

Фактический текст запроса: FullTextQueryImpl (jobTitle: "вход (архитектор художник)")

изменения кода что фиксируется все:

...........

 Term firstTerm = new Term("jobTitle", "entry"); 
    ** Term secondTerm = firstTerm.createTerm("ar"); 

     Term[] tTerms = new Term[] { firstTerm, secondTerm }; 
     MultiPhraseQuery multiPhrasequery = new MultiPhraseQuery(); 

     try { 
     File index = new File("I:/com.rhc.rayport.model.JobReq"); 
     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.println(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(firstTerm); 
     ** multiPhrasequery.add(terms); 

................