मैं अपनी संस्थाओं में से एक के लिए फ़ील्ड के समूह की खोज को सक्षम करना चाहता हूं। इसलिए, मैंने अपने स्प्रिंग बूट प्रोजेक्ट में हाइबरनेट खोज को जोड़ा। जब मैं डेटाबेस में डेटा लोड करता हूं, तो मैं देख सकता हूं कि Elasticsearch में वह डेटा है जो इंडेक्स में अपेक्षित है

curl localhost:9200/myindex/_search?pretty

मैं जैसे प्रश्न चला सकता हूँ

curl localhost:9200/myindex/_search?pretty&q=name:test

और अपेक्षित परिणाम प्राप्त करें।

मैं अपने एपीआई के उपभोक्ताओं को इंडेक्स के खिलाफ "नाम: परीक्षण" जैसे मनमाने प्रश्नों को चलाने का विकल्प देना चाहता हूं, ताकि

curl "localhost:8086/myentity/search/querySearch?query=name:test"

प्रत्यक्ष क्वेरी में पहले जैसा ही परिणाम लौटाएगा।

मैं जो कोशिश कर रहा हूं वह यहां है लेकिन मैं जो कुछ भी करता हूं, मुझे 0 परिणाम मिलते हैं:

public List<MyEntity> querySearch(String queryString) {
    QueryParser queryParser = new MultiFieldQueryParser(ALL_FIELDS, new SimpleAnalyzer());
    queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
    org.apache.lucene.search.Query query = queryParser.parse(QueryParser.escape(queryString));

    FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(this.entityManager);

    javax.persistence.Query persistenceQuery = 
            fullTextEntityManager.createFullTextQuery(query, MyEntity.class);

    return persistenceQuery.getResultList();
}
0
user3235738 20 जिंदा 2020, 11:15

1 उत्तर

सबसे बढ़िया उत्तर

QueryParser.escape(queryString) पर कॉल करके, आप : जैसे ऑपरेटरों का अर्थ हटा देते हैं। इसलिए यदि उपयोगकर्ता name:test में प्रवेश करता है, तो आप उन दस्तावेज़ों की तलाश में समाप्त हो जाएंगे जिनमें name:test (शाब्दिक रूप से) शामिल हैं, बजाय उन दस्तावेज़ों की तलाश के जिनकी name फ़ील्ड में test है।

उस पलायन को हटा दें और सब कुछ वैसा ही काम करना चाहिए जैसा आप चाहते हैं।

वैसे, आप अनिवार्य रूप से एक क्वेरी को पार्स करने के लिए ल्यूसीन का उपयोग कर रहे हैं जिसे तब Elasticsearch को भेजा जाएगा। एक आसान समाधान यह होगा कि क्वेरी को सीधे Elasticsearch को भेजा जाए, खासकर यदि आपको उपयोगकर्ताओं को कुछ क्षेत्रों तक पहुँचने से रोकने की आवश्यकता नहीं है।

public List<Training> querySearch(String queryString) {
    FullTextEntityManager fullTextEm = Search.getFullTextEntityManager(this.entityManager);

    QueryDescriptor query = ElasticsearchQueries.fromQueryString(queryString);

    javax.persistence.Query persistenceQuery = fullTextEm.createFullTextQuery(query, Training.class);

    return persistenceQuery.getResultList();
}

देखें https://docs.jboss.org/ हाइबरनेट/खोज/5.11/संदर्भ/en-US/html_single/#_queries

0
yrodiere 20 जिंदा 2020, 09:37