Skip to content
This repository was archived by the owner on May 17, 2025. It is now read-only.
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,18 @@
import com.cs5224.ipos.dto.PatentSearchRequest;
import com.cs5224.ipos.model.documents.Patent;
import com.cs5224.ipos.service.search.*;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.http.ResponseEntity;

import java.util.Collections;
import java.util.List;

@Component
@Slf4j
public class PatentSearchCommand {

@Autowired
Expand All @@ -25,11 +30,18 @@ public ResponseEntity<?> execute(PatentSearchRequest request) {
}

public ResponseEntity<?> executeEmbeddingSearch(EmbeddingSearchRequest request) {
List<Patent> results = patentSearchService.searchByTitleKeyword(request);
if (results == null || results.isEmpty()) {
return ResponseEntity.notFound().build();
log.info("📥 Received embedding search request: queryText='{}', threshold={}, k={}",
request.getQueryText(), request.getSimilarityThreshold(), request.getK());

List<Patent> results = patentSearchService.searchByTitleKeyword(request);

if (results == null || results.isEmpty()) {
log.info("🔍 No patents found matching embedding search criteria.");
return ResponseEntity.ok(Collections.emptyList());
}

log.info("✅ Found {} patent(s) matching embedding search criteria.", results.size());
return ResponseEntity.ok(results);
}
return ResponseEntity.ok(results);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,10 @@ public ResponseEntity<?> searchPatents(
@GetMapping("/vectorSearch")
public ResponseEntity<?> searchByTitleEmbedding(
@RequestParam String queryText,
@RequestParam(required = false, defaultValue = "0.8") Double similarityThreshold,
@RequestParam(required = false, defaultValue="10") Integer k) {
@RequestParam(required = false, defaultValue = "0.2") Double similarityThreshold,
@RequestParam(required = false, defaultValue="50") Integer k) {

log.info("🔥 in vectorSearch, queryText={} threshold={} k={}", queryText, similarityThreshold, k);

EmbeddingSearchRequest request = new EmbeddingSearchRequest();
request.setQueryText(queryText);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,15 @@ public EmbeddingService() {
* @return a List of Doubles representing the embedding vector.
*/
public List<Double> getEmbedding(String text) {
// Get Embedding
Response<Embedding> response = embeddingModel.embed(text);
Embedding embedding = response.content();

return embedding.vector();
Response<Embedding> response = embeddingModel.embed(text);
Embedding embedding = response.content();

float[] floatArray = embedding.vector();
List<Double> doubleList = new java.util.ArrayList<>(floatArray.length);
for (float f : floatArray) {
doubleList.add((double) f);
}

return doubleList;
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.cs5224.ipos.service.search;

import com.cs5224.ipos.dto.EmbeddingSearchRequest;
import com.cs5224.ipos.service.EmbeddingService;
import com.cs5224.ipos.service.embedding.EmbeddingService;
import lombok.extern.slf4j.Slf4j;
import com.cs5224.ipos.dto.PatentSearchRequest;
import com.cs5224.ipos.model.documents.Patent;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jms.activemq.ActiveMQProperties.Embedded;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.bson.Document;
Expand All @@ -13,7 +13,6 @@
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
Expand All @@ -24,6 +23,7 @@
import static com.cs5224.ipos.constants.MongoConstants.PATENT_COLLECTION;

@Service
@Slf4j
public class PatentSearchService {

private final MongoTemplate mongoTemplate;
Expand Down Expand Up @@ -90,13 +90,13 @@ public List<Patent> searchPatents(PatentSearchRequest request) {
public List<Patent> searchByTitleKeyword(EmbeddingSearchRequest request) {
// Convert keyword to vector:
List<Double> queryVector = embeddingService.getEmbedding(request.getQueryText());

log.info("📐 Generated query vector size={} first10={}", queryVector.size(), queryVector.subList(0, Math.min(10, queryVector.size())));
// Build the aggregation pipeline
List<AggregationOperation> pipeline = new ArrayList<>();

// search using knnBeta
Document knnSearch = new Document("$search",
new Document("index", "title_vector")
new Document("index", "title-search")
.append("knnBeta", new Document("vector", queryVector)
.append("path", "titleEmbeddings")
.append("k", request.getK()))
Expand All @@ -118,9 +118,10 @@ public List<Patent> searchByTitleKeyword(EmbeddingSearchRequest request) {
pipeline.add(Aggregation.match(Criteria.where("score").gte(request.getSimilarityThreshold())));

Aggregation aggregation = Aggregation.newAggregation(pipeline);
AggregationResults<Patent> aggResults = mongoTemplate.aggregate(aggregation, "your_collection_name", Patent.class);
AggregationResults<Patent> aggResults = mongoTemplate.aggregate(aggregation, "patent", Patent.class);

return aggResults.getMappedResults();

}

}
Expand Down
43 changes: 22 additions & 21 deletions ui/src/components/Chat/Chat.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,33 @@
import React from "react";
import {Box} from "@mui/material";
import { Box } from "@mui/material";
import UserInteraction from "./UserInteraction";
import Header from "./Header";
import { WIPNotice } from "../elements/WorkInProgress";

const Chat = () => {
return (
<Box sx={{
width: "100%",
display: "flex",
flexDirection: "column",
alignItems: "center",
p: 2,
}}>
return (
<>
<WIPNotice />

<Box
sx={{
width: "100%",
display: "flex",
flexDirection: "column",
alignItems: "center",
p: 2,
}}
>
<Box sx={{ width: "100%", maxWidth: "1200px", mt: 3 }}>

<Header/>

<Header />
</Box>


<Box sx={{ width: "100%", maxWidth: "1200px", mt: 3 }}>

<UserInteraction/>

<UserInteraction />
</Box>
</Box>
);
};

export default Chat;
</Box>
</>
);
};

export default Chat;
11 changes: 8 additions & 3 deletions ui/src/components/Home/HomePage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { useState } from "react";
import FadeInOutCard from "../elements/FadeInOutCard";
import Login from "../Login";

export default function HomePage() {
const [showLogin, setShowLogin] = useState(false);
const fadeCardsData = [
{
image: <SmartSearchIcon />,
Expand Down Expand Up @@ -31,10 +34,12 @@ export default function HomePage() {
</h1>
<p>
Gain real-time visibility into your IP assets with powerful
analytics and monitoring tools. Stay ahead of threats, track
performance, and ensure your network is always secure.
analytics and monitoring tools. Stay ahead with latest innovations.
</p>
<button>Start with a free trail</button>
<button onClick={() => setShowLogin(true)}>
Start with a free trial
</button>
<Login showLogin={showLogin} setShowLogin={setShowLogin} />
</div>
</div>
<div className="fade-card-container">
Expand Down
3 changes: 3 additions & 0 deletions ui/src/components/Nav/Nav.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
.bg-nav {
background-color: #cbd3df;
}
.nav-link {
transition: color 0.3s ease;
color: var(--nav-link-default);
Expand Down
5 changes: 0 additions & 5 deletions ui/src/components/Nav/Nav.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,6 @@ const Nav = () => {
Explore
</NavLink>
</li>
<li className="nav-item">
<NavLink to="/services" className={navLinkClass}>
Services
</NavLink>
</li>
<li className="nav-item">
<NavLink to="/status" className={navLinkClass}>
Profile
Expand Down
Loading